Как вы можете установить переменную на основе сеанса в базовом шаблоне ветки?

Я хочу подключить веточку к приложению, которое будет нуждаться в сессионных данных, включенных в базу. Например, текущий часовой пояс клиента отображается в нижнем колонтитуле. Это не имеет смысла для отдельных контролеров, чтобы знать об этом, так как это не имеет ничего общего с ними; но с другой стороны, они выбирают и заполняют представление:

class MyController 
{

    public function index()
    {
        $template = $this->twig->loadTemplate('myPageTemplate.html.twig');
        return $template->render($dataArray);
    }
}

Есть ли какой-то правильно сформированный способ передать объект данных ветке, прежде чем выбрать представление, и сделать его доступным для базового шаблона? Что-то, что вы сделаете, запустив Twig_Environment и передав его внутрь?

3 ответа

Если вы не хотите, чтобы все ваши контроллеры имели дело с внедрением этих "глобальных" переменных, вы можете реализовать базовый класс контроллеров, от которого наследуются все другие контроллеры, и делать следующее внутри:

public function render($view, array $parameters = array(), Response $response = null)
{
    if(!isset($parameters['timezone'])) {
         // fill the parameter with some value
        $parameters['timezone'] = $this->getSession()->get('timezone');
    }
    return parent::render($view, $parameters, $response);
}

Это позволяет вам делать "глобальную" инъекцию, не отдавая управление полностью контролерам.

Не забудьте заставить свой базовый контроллер расширять Symfony\Bundle\FrameworkBundle\Controller\Controller.

Лучшим подходом будет добавление расширения Twig, поэтому вам не нужно ничего включать в ваш контроллер. С помощью расширения вы можете добавить либо глобальный, как кто-то уже предложил ( http://twig.sensiolabs.org/doc/advanced.html), либо функции ( http://twig.sensiolabs.org/doc/advanced.html), которые затем можно использовать напрямую (например, {{ user_timezone() }}).

Переменные сессии должны быть установлены в контроллере. Как видно из документации, это будет выглядеть примерно так:

public function indexAction(Request $request)
{
    $session = $request->getSession();

    // store an attribute for reuse during a later user request
    $session->set('foo', 'bar');

    // get the attribute set by another controller in another request
    $foobar = $session->get('foobar');

    // use a default value if the attribute doesn't exist
    $filters = $session->get('filters', array());
}

Эти переменные затем легко передаются при рендеринге шаблона с чем-то вроде:

return $this->redirect($this->generateUrl('home', array('foobar' => $foobar)));
Другие вопросы по тегам