我想根据路由参数将Doctrine实体注入控制器操作,以减少控制器内部的代码重复数量。
例如,我有以下路线
product:
path: /product/edit/{productId}
defaults: { _controller: ExampleBundle:Product:edit }
而不是我目前的做法
public function editAction($productId)
{
$manager = $this->getDoctrine()->getManager();
$product = $manager->getRepository('ExampleBundle:Product')
->findOneByProductId($productId);
if (!$product) {
$this->addFlash('error', 'Selected product does not exist');
return $this->redirect($this->generateUrl('products'));
}
// ...
}
我希望这样处理,因为它目前在至少6个控制器动作中重复。
更符合这一点public function editAction(Product $product)
{
// ...
}
事实上,这实际上已经完成,我能找到的最好的例子是由SensioFrameworkBundle http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
完成的。我使用此功能但未在我们的Symfony项目中使用注释,因此需要查看备选方案。有关如何实现这一目标的任何建议?
答案 0 :(得分:2)
如果您仔细阅读the docs,您将了解到param转换器实际上没有注释工作:
要检测参数上运行的转换器,请运行以下过程:
- 如果使用@ParamConverter(converter =“name”)选择显式转换器,则选择具有给定名称的转换器。
- 否则,所有已注册的参数转换器都按优先级进行迭代。调用supports()方法来检查param转换器是否可以将请求转换为所需的参数。如果返回true,则调用param转换器。
换句话说,如果您没有在注释中指定param转换器,Symfony将遍历所有已注册的转换器并找到最适合处理您的参数的转换器(基于类型提示)。
我更喜欢使用注释来: