Установка переменной в представлении Twig перед визуализацией

Я использую Twig в приложении silex. В хуке предварительного запроса я хотел бы проверить, вошел ли пользователь в систему, и если они добавляют объект пользователя в Twig (чтобы я мог отображать состояние входа/выхода из системы в меню).

Однако, взглянув на исходный код, похоже, что можно только предоставить переменные представления шаблона в качестве аргумента для метода рендеринга. Я что-то упустил здесь?

Вот именно то, чего я хотел бы достичь:

// Code run on every request    

$app->before(function (Request $request) use ($app)
{
    // Check if the user is logged in and if they are
    // Add the user object to the view

    $status = $app['userService']->isUserLoggedIn();

    if($status)
    {
        $user = $app['userService']->getLoggedInUser();

        //@todo - find a way to add this object to the view 
        // without rendering it straight away
    }

});

person Ben Waine    schedule 11.04.2012    source источник


Ответы (3)


В дополнение к тому, что сказал Мерлин, вы можете сделать это:

$app['user'] = $user;

И в вашем шаблоне используйте:

{{ app.user }}
person igorw    schedule 15.04.2012

вы можете использовать twig->offsetSet(key, value) для предварительного рендеринга значений

пример при регистрации twig helper

$container['view'] = function ($c) {
    $view = new \Slim\Views\Twig('.templatePath/');

    // Instantiate and add Slim specific extension
    $basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
    $view->addExtension(new Slim\Views\TwigExtension($c['router'], $basePath));

    //array for pre render variables
    $yourPreRenderedVariables = array(
       'HEADER_TITLE' => 'Your site title',
       'USER'  => 'JOHN DOE'
    );
    //this will work for all routes / templates you don't have to define again
    foreach($yourPreRenderedVariables as $key => $value){
        $view->offsetSet($key, $value);
    }

    return $view; 
};

вы можете использовать его в шаблоне, подобном этому

<title>{{ HEADER_TITLE }}</title>
hello {{ USER }},
person A.Rafay    schedule 27.04.2016
comment
Slim и Silex — это разные фреймворки. Я думаю, вы должны сначала обратить внимание на заголовок вопроса, тело и теги. - person Pmpr; 09.11.2016

ответ, предоставленный Maerlyn, неправильно, так как нет необходимости использовать addGlobal, так как объект user уже существует в глобальной переменной окружения в twig как документация гласит:

Глобальная переменная

Когда мост Twig доступен, глобальная переменная ссылается на экземпляр App Variable. Он дает доступ к следующим методам:

{# The current Request #}
{{ global.request }}

{# The current User (when security is enabled) #}
{{ global.user }}

{# The current Session #}
{{ global.session }}

{# The debug flag #}
{{ global.debug }}

Кроме того, согласно документации, если вы хотите добавить другой глобальный с именем foo например, вы должны сделать:

$app->extend('twig', function($twig, $app) {
    $twig->addGlobal('foo', 127);                    // foo = 127
    return $twig;
});

После регистрации службы twig.

Зарегистрировать сервис twig так же просто, как:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/views',
));
person Pmpr    schedule 09.11.2016