Доктрина 2 с контейнером Symfony DI - PullRequest
2 голосов
/ 14 марта 2011

Я работаю над проектом Zend Framework, использующим Doctrine 2. Я также пытаюсь заставить DI-контейнер Symfony работать с проектом, но у меня возникли проблемы.Предположим, у меня есть класс "Foo", которому нужно ввести два экземпляра.Я могу установить контейнер Symfony DI без проблем, чтобы получить новый «Foo» с введенными зависимостями.Большой!Но что теперь, если я хочу превратить «Фу» в доктрину?Все хорошо, когда я вставляю сущность в БД, потому что я могу взять новую из контейнера DI и просто сохранить сущность.Однако, когда я запрашиваю сущность из DB Doctrine, создается экземпляр моих экземпляров "Foo", и им не будут вставлены правильные зависимости.Как заставить Doctrine использовать мой DI-контейнер, чтобы у сущности были соответствующие зависимости?Я знаю, что Doctrine предлагает хук «postLoad», который я мог бы использовать для внедрения зависимостей в мою сущность, но такой тип отрицает цель и выгоду контейнера DI.

Ответы [ 2 ]

4 голосов
/ 14 марта 2011

Учение Сущности является новым, а не инъекционным. Сущности не должны создаваться через DIC. См. Следующий пост в блоге о разнице между новыми и инъекционными:

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

0 голосов
/ 15 марта 2011

Это немного сложно, но это можно сделать.Существует патч для контейнера symfony di, который позволяет передавать уже существующий объект в экземпляр конструктора контейнеров и позволяет контейнеру di настраивать его для вас (например, вводить зависимости на основе интерфейсов).Патч реализован в этом репозитории на github: https://github.com/lstrojny/symfony, но не сделал его восходящим по отношению к главному репозиторию Symfony.

Вы используете его следующим образом:

$user = new User();
$container->configure('someId', $user);

Затем вы можете зарегистрировать обработчик событий PostLoad с помощью EventManager Doctrine (см. Подробности здесь: http://www.doctrine -project.org / docs / orm / 2.0 / en / reference / events.html ).В этом обработчике событий вы конфигурируете загруженную сущность с помощью вышеупомянутого метода.Это очевидно, но вы не можете использовать инжектор конструктора в этом случае, только установщик.

Это немного сложно настроить, но он может быть очень мощным, особенно в связи со способностью контейнера Symfony Di вводить зависимости на основе интерфейсов.

...