基于路由参数将Doctrine Entity注入Symfony控制器

时间:2015-04-10 20:42:40

标签: php symfony doctrine-orm controller entity

我想根据路由参数将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项目中使用注释,因此需要查看备选方案。有关如何实现这一目标的任何建议?

1 个答案:

答案 0 :(得分:2)

如果您仔细阅读the docs,您将了解到param转换器实际上没有注释工作:

  

要检测参数上运行的转换器,请运行以下过程:

     
      
  • 如果使用@ParamConverter(converter =“name”)选择显式转换器,则选择具有给定名称的转换器。
  •   
  • 否则,所有已注册的参数转换器都按优先级进行迭代。调用supports()方法来检查param转换器是否可以将请求转换为所需的参数。如果返回true,则调用param转换器。
  •   

换句话说,如果您没有在注释中指定param转换器,Symfony将遍历所有已注册的转换器并找到最适合处理您的参数的转换器(基于类型提示)。

我更喜欢使用注释来:

  • 明确
  • 节省一些处理时间