Symfony将Doctrine Manager实例注入控制器方法参数

时间:2017-12-06 08:21:26

标签: php symfony doctrine symfony4

在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()
    ]);
}

1 个答案:

答案 0 :(得分:2)

我还没有尝试过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();
}