Вурдалак, эй пацан, псс, есть чо по виджетам?
для устранения неясностей, обзовем виджетом некий кусок, рендерещийся в шаблоне — топ комментариев, облако тегов, последние 3 статьи и т.п.
есть два варианта у меня, архитектура общая
иду не по CQRS, хотя можно и в разрезе этого подхода обсудить
FooController::__construct(RequestInterface $request, FooResponder $responder)
Другими словами, FooController в конструкторе получает Request и Responder, экшены возвращают Response
Что такое Responder — это Сервис-фабрика для генереации Response
В зону ответственности Responder входят: заголовки, шаблонизатор
Что мы получаем от такого подхода:
- убираем наконец заголовки из контроллеров
- инкапсулируем View (вместо $this->render('foo',['articel'=>$article]) вызываем $this->responder->renderArticle($article)), то есть общение с View только по публичному интерфейсу с тайпхинтингом
И вот тут вопрос как рендерить виджеты, непосредственно способы:
1) Виджеты хранятся в слое Presentation, при этом Responder в конструкторе получает контейнер, который lazy load'ит виджеты, ну или как то по-другому он их получает... это не важно... главное зона ответственности, Responder знает о виджетах и может их вызывать. Каждый виджет — сервис, прописанный в DIC.
Ну например последние статьи.
LatestArticlesWIdget::__construct(ArticlesRepository $repo)
WidgetInterface::render(TemplatingInterface $templating)
2) В случае с Симфони прокидываем HttpKernel в Responder и оттуда (или из templating) делаем sub-request
мне этот вариант не нравится, ибо я принципиально против подзапросов и различных forward костылей
что думаешь? есть еще варианты?