Как получить доступ к сервису шаблонов не в контроллере - PullRequest
1 голос
/ 17 октября 2011

Хорошо, проблема в следующем:

У меня есть какая-то сущность 'order', и у нее есть свойство 'status'. При изменении статуса я хотел, чтобы некоторые другие объекты были проинформированы об этом событии, поэтому я решил использовать шаблон Observer. Один из наблюдателей уведомляет клиентов по электронной почте. Теперь я хочу сделать текст электронной почты из некоторых шаблонов веточек. Как я понял из Книги, шаблоны рендеринга в контроллерах выполняются с помощью службы шаблонов.

Итак, вопрос в следующем: Как я могу получить доступ к службе шаблонов в моем классе Observer?

Спецификация: Мне посоветовали реализовать Observer в качестве службы, но я не уверен в этом. Я пытался решить эту проблему, и вот мои варианты:

  1. Использовать реестр. Решение, которое является прямым и твердым как рельс. Я предполагаю, что это пропускает весь смысл DI и Service Container. Огромным плюсом этого решения является то, что я могу получить доступ ко всем распространенным службам из любой точки моего приложения.

  2. Для передачи необходимых сервисов из контекста через конструктор или через сеттеры. Это больше похоже на дух Sf2. Приходит еще один список проблем, которые не связаны с этим полем вопросов.

  3. Использование наблюдателей в качестве услуги. Я не совсем уверен «об этой опции», потому что в книге написано, что сервис - это общая функциональность, и я не думаю, что наблюдающая сущность с рядом дискретных свойств является обычной задача.

Я ищу Sf2 спиртовое решение, которое будет распространяться на весь проект, поэтому все ответы с объяснениями приветствуются.

1 Ответ

1 голос
/ 17 октября 2011

Как и для любой другой службы в проекте Symfony2, вы можете получить к ней доступ из других классов через контейнер инжектора зависимости.По сути, вы должны зарегистрировать свой класс наблюдателя в качестве службы, а затем внедрить службу шаблонов в службу наблюдателей.См. Документы для инъекционных услуг .

Если вы не знакомы с тем, как Symfony обрабатывает внедрение зависимостей, я бы рекомендовал прочитать всю главу документации - это очень полезно.Также, если вы хотите найти все сервисы, которые зарегистрированы для приложения, вы можете использовать консольную команду container:debug.После этого вы также можете добавить название службы, чтобы просмотреть подробную информацию об услуге.

Изменить
Я прочитал ваши изменения в вопросе, но все же рекомендую перейти по маршруту DI.Это является духом Symfony2 :) Вы обеспокоены тем, что ваш наблюдатель недостаточно распространен, чтобы использовать его в качестве службы, но нет строгого правила, говорящего: «Вы должны использовать этот фрагмент кода в X местах вдля того, чтобы оно было «общим».

Использование DIC дает еще одно огромное преимущество - оно обрабатывает другие зависимости для вас.Допустим, в шаблонном сервисе есть 3 сервисы, внедренные в себя.При использовании DIC вам не нужно беспокоиться о зависимостях службы шаблонов - они обрабатываются для вас.Все, о чем вы заботитесь, - это попросить его «внедрить шаблонную службу в эту другую службу», а Symfony позаботится обо всей тяжелой работе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...