我在一个silex应用程序中使用Twig。在预请求挂钩中,我想检查用户是否已登录,以及是否将用户对象添加到Twig(因此我可以在菜单中呈现登录/注销状态)。
然而,看过源代码后,它看起来只能将模板视图变量作为render方法的参数提供。我在这里错过了什么吗?
这正是我想要实现的目标:
// 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
}
});
答案 0 :(得分:18)
$app["twig"]->addGlobal("user", $user);
答案 1 :(得分:15)
除了Maerlyn所说的,你可以这样做:
$app['user'] = $user;
在您的模板中使用:
{{ app.user }}
答案 2 :(得分:1)
您可以使用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 }},
答案 3 :(得分:0)
answer provided by Maerlyn 错误,因为不需要使用addGlobal
,因为user
对象已存在于twig中的环境全局变量中documentation说:
全局变量
当Twig桥可用时,全局变量引用
App
变量的实例。它允许访问以下方法:{# The current Request #} {{ global.request }} {# The current User (when security is enabled) #} {{ global.user }} {# The current Session #} {{ global.session }} {# The debug flag #} {{ global.debug }}
根据documentation的麻生,如果你想添加任何其他名为foo
的全局,你应该这样做:
$app->extend('twig', function($twig, $app) {
$twig->addGlobal('foo', 127); // foo = 127
return $twig;
});
注册树枝服务。
注册树枝服务非常简单:
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__.'/views',
));