В 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()
]);
}
Я еще не пробовал 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();
}
Других решений пока нет …