symfony4, внедрение зависимости, аргумент по умолчанию отсутствует - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть служба настройки для функции контроллера, как это

App\Controller\Controller:
    calls:
        - [new, ['@request_stack','@doctrine.orm.default_entity_manager']]

Мне нужно Entity Manager внутри действия контроллера, и моя функция выглядит следующим образом

public function new(RequestStack $request, EntityManager $em): Response
{
    $currentRequest = $request->getCurrentRequest();
    $data = json_decode($currentRequest->getContent(), true);
    ....
    return new ApiResponse(['message' => $message['message'], 'body' => 'success']);
}

и при выполнении доходит до строки return new ApiResponse выдает ошибку

Controller "Controller::new()" requires that you provide a value for the "$request" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.

Как заставить менеджера сущностей в действии контроллера или как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

хорошо.вам нужно внедрить ваши вещи в конструктор объекта контроллера - который называется DI по-Symfony (или через set-методы):

services.yml - если все нормально с вашим autowire

App\Controller\Controller:
    calls:
        - [new]

, если не добавить его вручную:

 App\Controller\Controller:
    arguments:
        - '@doctrine.orm.default_entity_manager'
    calls:
        - [new]

Controller.php

/** @var EntityManager */
private $em;

public __construct(EntityManager $em)
{
    $this->em = $em;
}

, а затем просто использовать его в своем методе:

public function new(RequestStack $request): Response
{
    $this->em ...
}
0 голосов
/ 12 апреля 2019

Для вашей информации вы можете создать свой собственный AbsractController для внедрения EntityManager во все контроллеры, расширяющие его следующим образом.

<?php

namespace App\Controller;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as BaseController;

abstract class AbstractController extends BaseController
{
    /**
     * @var EntityManagerInterface
     */
    protected $em;

    /**
     * @required
     *
     * @param EntityManagerInterface $em
     */
    public function setEntityManager(EntityManagerInterface $em)
    {
        $this->em = $em;
    }
}

Если контроллер расширяет этот AbstractController, вы можете получить доступ к $ this-> em везде вit.

«Необходимая» аннотация здесь является ключом для включения того, что вы пытались сделать, без необходимости добавления конфигурации, как вы это сделали.Это похоже на добавление линии вызовов в вашей конфигурации!

Вы можете сделать что-то подобное для всех сервисов, которые вам нужны во всех ваших контроллерах.

0 голосов
/ 12 апреля 2019

Как сказано в Документе Symfony 4 по Doctrine:

// you can fetch the EntityManager via $this->getDoctrine()
// or you can add an argument to your action: index(EntityManagerInterface $entityManager)
$entityManager = $this->getDoctrine()->getManager();

Таким образом, вы можете просто получить таким образом менеджер сущностей в своем контроллере

Однако вы также можете зарегистрировать Entity Manager каксервис для его использования.

Убедитесь, что для autowire установлено значение true:

# config/services.yaml
services:
    _defaults:
        autowire: true

и зарегистрируйте его как сервис:

   # config/services.yaml
   services:
     #....
        controller_em:
            class: App\Controller\Controller
            arguments: [ '@doctrine.orm.default_entity_manager' ]
            public: true

, чтобы вы моглииспользуйте его так в вашем контроллере:

private $objectManager;

public function __construct(ObjectManager $objectManager)
{
    $this->objectManager = $objectManager;

}

Вы также можете использовать этот способ для использования Entity Manager в Voter или Manager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...