2013-07-11 4 views
0

Я только что прочитал статьи http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1 и задал некоторые вопросы о контейнере DI.DI Контейнеры и контроллеры

Предположим, что я хочу запустить событие внутри своего контроллера, как я могу получить диспетчер внутри моего контроллера?

Я начинаю свою тестовую базу через

$c->get('app')->handle($request); 

где 'приложение' является Symfony \ HttpKernel. Как я могу установить зависимости в контейнере? Скажем, у меня есть вид двигателя, определенный в контейнере

$c->register('view.engine', 'Core\ViewEngine'); 

и я хочу дать этот объект, или решить, что объект, внутри моего контроллера, чтобы сделать некоторые виды. Это та же проблема с огнем события, у меня нет доступа к этим значениям внутри моего контроллера ... Как контейнер DI должен работать в таких ситуациях?

Спасибо!

ответ

-1

Существуют разные подходы. Возможно, вы захотите прочитать документацию silex в качестве следующего шага. В silex приложение само по себе является контейнером DI. Вы также можете прочитать введение в документацию Symfony 2.

Самый простой подход (и тот, который используется S2 по умолчанию) заключается в том, чтобы вставить сам контейнер DI в ваш контроллер. Затем контроллер может вытащить службы, такие как диспетчер, по мере необходимости.

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

==================================================================================================================================

Как бы я ввел контейнер в контроллер?

Это то, что касается существующих фреймворков, которые пригождаются. Помните, что HTTPKernel является компонентом, а не каркасом. Как вы это используете, зависит от вас.

В Symfony 2 объект приложения фактически получен из ядра, а не из HTTPKernel. Ядро в свою очередь содержит экземпляр HTTPKernel, а также экземпляр контейнера.

Существует несколько подходов, которые вы можете предпринять. Единого «правильного» нет.

Если вы смотрите в HTTPKernel :: handleRaw вы найдете:

$controller = $this->resolver->getController($request)) 

Вы можете сделать свой собственный объект управления распознавателя, который бы впрыснуть контейнер после создания контроллера. Только одна возможность.

+0

Как бы я ввел контейнер в контроллер? Поскольку HttpKernel создает мой контроллер, я не могу передать его через конструктор, и у меня нет контроля над контроллером, так как все, что я получаю взамен, является объектом ответа – user2538584

+0

Диск без голосования через два года после факта. Так храбр. – Cerad

Смежные вопросы