Symfony3 Использование Entity Manager в пользовательском контейнере

Я хочу создать HelperController для своего проекта. Я создаю контроллер с доктриной: сгенерировать: контроллер, и мне нужно использовать в нем диспетчер сущностей.

Я вставил в services.yml, но он выдает такую ​​​​ошибку:

Argument 1 passed to CampingBundle\Controller\HelperController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given ...

Мой код контроллера:

namespace CampingBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Doctrine\ORM\EntityManager;

class HelperController extends Controller
{
    protected $manager;

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

Мои услуги.yml:

services:
  camping.helper_controller:
      class: CampingBundle\Controller\HelperController
      arguments: ["@doctrine.orm.entity_manager"]

Почему это не работает? Должен ли я очистить кеш или что-то еще, или что-то не так в определении?

Спасибо


person Çağdaş DAĞ    schedule 11.02.2018    source источник
comment
Это не работает из-за того, как вы настроили свой маршрут. Вам нужна небольшая настройка, чтобы указать преобразователю контроллера вытащить контроллер из контейнера, а не создавать его заново. symfony.com/doc/current/controller/ Однако я немного подозрительно отношусь к имени вашего контроллера. Надеюсь, ваш HelperController не предназначен для помощи другим контроллерам.   -  person Cerad    schedule 11.02.2018
comment
Если у вас есть установщик пакета доктрины, 1: ваш менеджер доступен по вызову $this->getDoctrine()... 2- поскольку вы расширяете базовый контроллер, у вас есть доступ к $container, поэтому вы можете зарегистрировать службу, которая обрабатывает вашего менеджера инициализация и доступ к ней   -  person timmz    schedule 29.11.2018


Ответы (2)


Попробуйте использовать EntityManagerInterface и удалите extends Controller. Перейдите по этой ссылке, если вам нужен CAS (контроллеры как службы). Изменить protected $manager; на private $manager;

namespace CampingBundle\Controller;

use Doctrine\ORM\EntityManagerInterface;

class HelperController
{
    /**
     * @var EntityManagerInterface $entityManager
     */
    private $entityManager;

    /**
     * @param $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
}
person 0TshEL_n1ck    schedule 11.02.2018
comment
Я пробовал это, но он все еще выдает ошибку, например: Аргумент 1, переданный в CampingBundle\Controller\HelperController::__construct(), должен реализовать интерфейс Doctrine\ORM\EntityManagerInterface, ни один не задан, вызван в .. - person Çağdaş DAĞ; 11.02.2018
comment
Правильно ли вы внедрили DI в свой CampingBundle? Добавьте свой camping.helper_controller: class: CampingBundle\Controller\HelperController arguments: ["@doctrine.orm.entity_manager"] в app/config/services.yml для проверки. - person 0TshEL_n1ck; 11.02.2018
comment
И вам нужно найти свой сервис в определениях сервисов. bin/console debug:container | grep HelperController - person 0TshEL_n1ck; 11.02.2018
comment
@ 0TshEL_n1ck — если ему нужен обычный контроллер, ему нужно будет расширить базовый класс контроллера. И переход с EntityManager на EntityManagerInterface не поможет, если аргументы не передаются. Одна вещь, которую я нашел полезной при ответе на вопросы, заключалась в том, чтобы воспроизвести реальную проблему, а затем протестировать любые предлагаемые решения перед публикацией. Просто мысль. - person Cerad; 11.02.2018
comment
@Cerad, по моему скромному мнению, ему нужно правильно реализовать внедрение зависимостей для передачи данных. Насчет штатного контроллера я прошел по ссылке про CAS. И я указал ему на основные вещи про EntityManagerInterface и модификаторы доступа, потому что без понимания этих вещей ему будет тяжело. - person 0TshEL_n1ck; 11.02.2018
comment
@0TshEL_n1ck Ну, мое мнение значительно скромнее твоего. Юмор. Я хочу сказать, что его исходный код контроллера правильный. Ему просто нужно настроить определение маршрута. Он, вероятно, также обнаружит, что ему нужно добавить setContainer в определение своего сервиса. Конечно, мы все немного гадаем, какая именно версия Symfony используется. Начиная с версии 3.3 или около того, autowire сделает большую часть этого спорным. - person Cerad; 11.02.2018
comment
@Cerad Я согласен, мы просто догадываемся, что ему нужно :) Но я думаю, что ему не нужен обычный контроллер, потому что он пытается настроить определение службы в файле services.yml. - person 0TshEL_n1ck; 11.02.2018

Я оставлю свои два цента здесь, так как у меня была такая же проблема, и я исправил ее, добавив tags в службу.

something.validate.some_service:
  class: Path\To\Some\Validator
  arguments:
    - '@doctrine.orm.entity_manager'
  tags:
    - { name: validator.constraint_validator, alias: some_validator_alias }

Как работать с служебными тегами от Symfony

person Katka    schedule 29.11.2018