Я использую упрощенный контроллер и не имею контейнер обслуживания. Я пытаюсь ввести учение в службу. Вот ошибка:
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; }