Php 如何在细枝基模板中设置基于会话的变量?

Php 如何在细枝基模板中设置基于会话的变量?,php,symfony,twig,template-inheritance,Php,Symfony,Twig,Template Inheritance,我想将twig插入一个应用程序,该应用程序需要将一些基于会话的数据合并到数据库中。例如,客户端的当前时区显示在页脚中。单独的控制器知道这一点是没有意义的,因为这与他们无关;但另一方面,它们选择并填充视图: class MyController { public function index() { $template = $this->twig->loadTemplate('myPageTemplate.html.twig'); r

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

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

在选择视图之前,是否有一些格式良好的方法将数据对象传递给twig,并使其可用于基础模板?启动Twig_环境并将其传入时要执行的操作?

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

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)));

如果不希望所有控制器都处理这些“全局”变量的注入,则可以实现所有其他控制器从中继承的基本控制器类,并在内部执行以下操作:

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。

最好的方法是添加一个细枝扩展,这样您就不必在控制器中包含任何内容。有了这个扩展,你可以添加一个已经被推荐的全局函数()或函数(),然后你可以直接使用它(比如{{user\u timezone()})。

u可以使用{session.name}},如果它工作的话,它看起来像是从一个超全局中提取的app.session.get('name'),对不起:)你也可以用$twig->addGlobal将它注册为一个全局函数('session',$\u session);您可以创建一个自定义的细枝函数,并在任何需要的地方调用它,比如
{{your\u function()}
。这看起来是一个聪明、干净的方法;我还不确定我是否希望我的所有控制器都扩展一个基址,但是……当你从Symfony\Bundle\FrameworkBundle\Controller\Controller继承时,它们无论如何都会扩展。@janwschaefer-我们还没有使用完整的Symfony堆栈--只是插入一些组件。到目前为止,控制器s没有扩展我看到的任何内容。您可以更进一步。查看symfony提供的基本控制器中render()的实现。它们调用return$this->container->get('templating')->renderResponse($view,$parameters,$response);因此,您可以扩展该服务,执行我在renderResponse中提出的hack,并使用您自己的服务代替模板。如何填充控制器中的细枝字段?使用服务容器?