3

我想将 twig 插入需要在基础中包含一些基于会话的数据的应用程序中。例如,客户端的当前时区显示在页脚中。单个控制器知道这一点是没有意义的,因为这与他们无关;但另一方面,他们选择并填充视图:

class MyController 
{

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

在选择视图之前,是否有一些格式良好的方法可以将数据对象传递给 twig,并使其可用于基本模板?在启动 Twig_Environment 并将其传入时你会做什么?

4

3 回答 3

1

会话变量需要在控制器中设置。从文档中可以看出,它看起来像这样:

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)));
于 2014-08-09T18:56:23.077 回答
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。

于 2014-08-09T22:39:10.797 回答
1

最好的方法是添加一个 Twig 扩展,这样您就不必在控制器中包含任何内容。使用扩展,您可以添加一个已经有人建议的全局(http://twig.sensiolabs.org/doc/advanced.html#globals)或函数(http://twig.sensiolabs.org/doc/advanced.html #functions)然后您可以直接使用(例如 {{ user_timezone() }} )。

于 2014-08-22T04:43:08.077 回答