2016-09-20 3 views
3

В моем проекте SF3, у меня есть две услуг, которые зависят друг от друга и вызывают круговой вопрос референции:службы со ссылкой сборкой из Symfony3

page_handler : 
    arguments : ["@sentence_handler"] 
sentence_handler : 
    arguments : ["@page_handler"] 

Потому что, из класса PageHandler я использую SentenceHandler добавить предложение на страницу , и из SentenceHandler я использую PageHandler для получения всех предложений от страницы.

Я замечаю 3 варианта, чтобы исправить это:

  • Перенести мой метод addSentence() к SentenceHandler: Но я изменю страницу из SentenceHandler, это не логично.
  • Переместить метод getAllSentences() в PageHandler: Но я получаю предложения от PageHandler, это не логично.
  • Дубликат GetPage() метод от PageHandler к SentenceHandler, который станет независимым: Но это не DRY

Что такое лучший метод? У вас есть другие идеи?

+0

Худший способ заключается в том, чтобы вводить контейнер в службу и получать соответствующую услугу по мере необходимости. Обычно избегайте делать это [http://symfony.com/doc/current/components/dependency_injection.html#avoiding-your-code-becoming-dependent-on-the-container) – Matteo

+1

Может ли функция getPage перемещаться в это собственное обслуживание и вводится в другие обработчики? Это позаботится о ваших сухих проблемах. – Cerad

ответ

2

Использование setter injection на обе услуги:

page_handler: 
    class: PageHandler 
    calls: 
     - ["setSentenceHandler", ["@sentence_handler"]] 

sentence_handler: 
    class: SentenceHandler 
    calls: 
     - ["setPageHandler", ["@page_handler"]] 

Пока вам не нужно/воспользоваться услугами в застройщик (что проблематично в любом случае), будет не заметна разница. Это означает, что вы можете безопасно вводить услуги в другие службы позже.

+0

Спасибо, я не знаю различных типов инъекций! – johnnyevolunium

+1

Просто будьте осторожны. Трюк работает, но такие кросс-зависимости могут затруднить работу с вашим кодом. – Cerad

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