Symfony внедрил экземпляр Doctrine Manager в аргументы метода контроллера

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]