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