【问题标题】:Symfony injected Doctrine Manager instance to controller method argumentsSymfony 将 Doctrine Manager 实例注入控制器方法参数
【发布时间】:2018-05-20 01:37:10
【问题描述】:

在Controller中,你可以定义一个更新动作:

    /**
     * @Route("/product/edit/{id}")
     */
    public function updateAction(Product $product)
    {
     // product is auto select from database by id and inject to controller action.
    }

自动注入很方便,但是如何将Doctrine Manager实例注入到控制器动作中,不用手动创建Doctrine Manager实例会更方便。如下:

    /**
     * @Route("/product/edit/{id}")
     */
    public function updateAction(Product $product, ObjectManager $em)
    {
       $product->setName("new name");
       $em->flush();
    }

而不是长编码:

/**
 * @Route("/product/edit/{id}")
 */
public function updateAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository(Product::class)->find($id);

    if (!$product) {
        throw $this->createNotFoundException(
            'No product found for id '.$id
        );
    }

    $product->setName('New product name!');
    $em->flush();

    return $this->redirectToRoute('app_product_show', [
        'id' => $product->getId()
    ]);
}

【问题讨论】:

    标签: php symfony doctrine symfony4


    【解决方案1】:

    我还没有尝试过 Symfony4,但是根据官方的 symfony 文档,有基于动作的依赖注入,所以你应该能够通过将服务接口声明为你的动作的参数来使用服务。

    https://symfony.com/doc/4.1/controller.html#controller-accessing-services

    如果您需要控制器中的服务,只需键入提示带有其类(或接口)名称的参数。 Symfony 会自动向您传递您需要的服务:

    所以在你的情况下应该是这样的:

    /**
      * @Route("/product/edit/{id}")
      */
    public function updateAction(Product $product, EntityManagerInterface $em)
    {
        $product->setName("new name");
        $em->flush();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-27
      • 2015-11-10
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2014-08-23
      相关资源
      最近更新 更多