Обмен данными между встроенными контроллерами в Symfony2

Я новичок в 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() метод, который возвращает существующие данные. Затем служебные данные устанавливаются из основного контроллера и могут быть получены из сервисного контейнера во встроенных контроллерах.

0

Решение

Я думаю, что лучше всего использовать сервис, который будет получать все данные, которые вы хотите 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]