Я новичок в Symfony2 и после нескольких уроков решил перенести мои проекты в эту среду.
В моем проекте у меня есть несколько модулей, которые имеют разные шаблоны, но имеют одни и те же данные. Например, menu: пункты меню извлекаются из базы данных и используются стандартным меню веб-сайта, а также меню нижнего колонтитула. Я читал, что лучше всего создавать контроллер для такой задачи и вставлять его прямо в основной макет, например так:
//Controller
class PageComponentController extends Controller
{
public function menuAction()
{
//get menu items from database...
$menu_items = ...
return $this->render('MyProjectBundle:PageComponent:menu.html.twig', [
'menu_items' => $menu_items
]);
}
}
//Template
{% block body %}
{% render controller('MyProjectBundle:PageComponent:menu', { 'current_page': current_page }) %}
{% endblock %}
Но тогда мне нужно пройти те $menu_items
в нижнем колонтитуле, а также сделать нижний колонтитул из footerAction()
в PageComponentController
,
Я знаю, что есть способы сделать это, но какова лучший способ обмениваться такими взаимными данными между различными встроенными контроллерами в Symfony2?
ОБНОВИТЬ (решение на основе oliganответ)
Область действия контейнера службы доступна как из основного контроллера (ответственного за отображение страницы), так и из встроенных контроллеров. Так что было бы довольно чисто и сухо написать класс обслуживания с getMenu()
метод, который выбирает данные из БД, и outputMenu()
метод, который возвращает существующие данные. Затем служебные данные устанавливаются из основного контроллера и могут быть получены из сервисного контейнера во встроенных контроллерах.
Я думаю, что лучше всего использовать сервис, который будет получать все данные, которые вы хотите http://symfony.com/doc/current/book/service_container.html (более или менее похож на контроллер, но доступен везде)
Чтобы дать вам представление, что это такое
class MenuService
{
public function getMyMenu()
{
... your code to get the menu
}
}
Тогда объявите это в services.yml в вашем комплекте
services:
getMenuService:
class: ..\...\...\MenuService
А затем просто используйте его в любом контроллере, выполнив
$menu = $this->container->get('getMenuService');
если вам нужно использовать наследие шаблона, вы все равно можете получить доступ к объекту в родительском шаблоне, выполнив
{% extends "...Bundle..:myMenu.html.twig" %}
{% set menu = myMenuTwigvar %}
а затем myMenu, например, menu.button1
Других решений пока нет …