Ядро контроллеров

На каждом сайте существует множество блоков (меню, погода, новости...), чтобы не использовать SonataBlockBundle, не подключать контроллеры в каждом шаблоне - создаем ядро контроллеров

Создадим бандл AcmeDemoBundle, теперь добавим ядро контроллеров (Acme/DemoBundle/Controller/CoreController.php)

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class CoreController extends Controller
{
    // параметры шаблона
    public function param()
    {
        return array(
            'main_menu' => // подключаем контроллер или сервис главного меню
            'sub_menu' => // ...
            'base_template' => $this->getBaseTemplate() // базовый шаблон бандла/сайта
        );
    }
    
    // генерируем новый шаблон с параметрами
    public function template($template, $params = array())
    {
        return $this->render($template,
            array_merge(
                $this->param(),
                $params
            )
        );
    }

    // указываем базовый шаблон
    public function getBaseTemplate()
    {
        return 'AcmeDemoBundle::layout.html.twig';
    }
}

создадим и добавим в шаблон AcmeDemoBundle::layout.html.twig теги

<div id="main-menu">{{ main_menu }}</div>

<div id="sub-menu">{{ sub_menu }}</div>

<div id="body">{% block body %}{% endblock %}</div>

создадим и добавим в шаблон для вывода основной информации AcmeDemoBundle:Main:index.html.twig главной страницы

{% extends base_template %}

{% block body %}
Содержимое главной страницы {{ test_tag }}
{% endblock %}

создаем контроллер главной страницы

namespace Acme\DemoBundle\Controller;

use Acme\DemoBundle\Controller\CoreController;

class AdminController extends CoreController
{
    public function indexAction()
    {
        return $this->template('AcmeDemoBundle:Main:index.html.twig', array(
            // можем добавить свои теги
            'test_tag' => 'Test tag'
            //или изменить существующие
            //'main_menu' => ...
            //'base_template' => ...
        ));

        // либо используем стандартной функцией с нашими параметрами $this->params
        // return $this->render('AcmeDemoBundle:Main:main.html.twig', $this->params);
    }
}