我想根据路由参数将 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项目中使用注释,所以需要寻找替代方案。关于如何实现这一目标的任何建议?
如果您仔细阅读文档,您将了解到参数转换器实际上无需注释即可工作:
要检测哪个转换器在参数上运行,请运行以下过程:
- 如果使用 @ParamConverter(converter="name") 显式选择转换器,则选择具有给定名称的转换器。
- 否则,所有已注册的参数转换器都将按优先级迭代。调用 supports() 方法来检查参数转换器是否可以将请求转换为必需的参数。如果返回 true,则调用参数转换器。
换句话说,如果你没有在注释中指定参数转换器,Symfony将遍历所有注册的转换器,并找到最合适的转换器来处理你的参数(基于类型提示)。
我更喜欢放置注释以便:
- 明确
- 节省一些处理时间