我想将twig插入到需要在基础中包含一些基于会话的数据的应用程序中。例如,客户端的当前时区显示在页脚中。对于个体控制器而言,了解这一点并不合理,因为它与它们无关;但另一方面,他们选择并填充视图:
class MyController
{
public function index()
{
$template = $this->twig->loadTemplate('myPageTemplate.html.twig');
return $template->render($dataArray);
}
}
在选择视图之前,是否有一些格式良好的方法可以将数据对象传递给twig,并使其可用于基本模板?你在启动Twig_Environment并传入它时会做些什么?
答案 0 :(得分:1)
需要在控制器中设置会话变量。可以看出in the docs,它看起来像这样:
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)));
答案 1 :(得分:1)
如果您不希望所有控制器都处理注入那些"全球"变量,您可以实现所有其他控制器继承的基本控制器类,并在其中执行以下操作:
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。
答案 2 :(得分:1)
最好的方法是添加一个Twig扩展名,这样您就不必在控制器中包含任何内容。使用扩展程序,您可以添加全局,例如已建议的人(http://twig.sensiolabs.org/doc/advanced.html#globals)或函数(http://twig.sensiolabs.org/doc/advanced.html#functions),然后您可以直接使用(例如{{user_timezone()}}。