根据路由参数将学说实体注入到Symfony控制器中



我想根据路由参数将 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将遍历所有注册的转换器,并找到最合适的转换器来处理你的参数(基于类型提示)。

我更喜欢放置注释以便:

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

相关内容

  • 没有找到相关文章

最新更新