Как я могу ввести доктрину в службу Symfony2

Я использую упрощенный контроллер и не имею контейнер обслуживания. Я пытаюсь ввести учение в службу. Вот ошибка:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Acme\Controller\WebController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/hcs/Core/app/cache/dev/appDevDebugProjectContainer.php on line 3036 and defined in /home/hcs/Core/src/Acme/Controller/WebController.php line 28 

Вот мой сервис def:

 doctrine: dbal: driver: %database_driver% host: %database_host% port: %database_port% dbname: %database_name% user: %database_user% password: %database_password% charset: UTF8 orm: mappings: Acme: type: annotation dir: %kernel.root_dir%/../src/Acme/Model prefix: Acme\Model alias: Model is_bundle: false services: WebController: class: Acme\Controller\WebController arguments: [@doctrine.orm.entity_manager ] parent: elnur.controller.abstract 

И мой класс

 use Doctrine\ORM\EntityManager; /** * @Service("WebController", parent="elnur.controller.abstract") */ class WebController extends AbstractController { protected $em; public function __construct(EntityManager $em) { $this->em = $em; } 

Здесь выводится из контейнера SF2 (php app / console container: debug | grep -i en tity)

 doctrine.orm.default_entity_manager container EntityManager5330e85ad5afb_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager doctrine.orm.entity_manager n/a alias for doctrine.orm.default_entity_manager doctrine.orm.validator.unique container Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator form.type.entity container Symfony\Bridge\Doctrine\Form\Type\EntityType translator container Symfony\Component\Translation\IdentityTranslator 

Я также пробовал аргументы: ["@ doctrine.orm.entity_manager"] в определении службы и все еще ничего. Я пробовал очистить свой кеш, но я не могу на всю жизнь получить инъекцию ЭМ. Что я делаю не так?

Проблема в том, что вы смешиваете как определение сервиса YAML, так и аннотации DiExtra для одного и того же класса. Определение YAML заполнено и обеспечивает требуемую зависимость, но вы не добавили @InjectParams для воспроизведения с аннотацией @Service . В принципе, вы создаете две службы одного класса, используя разные подходы, и подход аннотаций не является полным.

Либо удалите аннотацию @Service из класса, либо, если вы предпочитаете аннотации (что я и делаю), также вставляйте зависимости с аннотациями и избавляйтесь от определения службы YAML:

 /** * @InjectParams({ * "em" = @Inject("doctrine.orm.entity_manager") * }) */ public function __construct(EntityManager $em) { $this->em = $em; } 

Аннотации @InjectParams соответствуют именам параметров, например $em для имен служб, таких как @em . Поскольку службы @em нет, вам необходимо переопределить соответствие по умолчанию с аннотацией @Inject .

Но есть способ упростить его. Вы можете @em псевдоним менеджера @em в @em в свой конфигурационный файл YAML:

 services: em: alias: doctrine.orm.entity_manager 

Теперь вы можете упростить аннотацию @InjectParams :

 /** * @InjectParams */ public function __construct(EntityManager $em) { $this->em = $em; }