【问题标题】:How to define global variable for Twig如何为 Twig 定义全局变量
【发布时间】:2014-09-12 15:51:14
【问题描述】:

我正在使用一个用作表单布局的文件来覆盖某些元素(form_startform_row 等)。我像这样注册它:

twig:
    - AcmeMainBundle:Form:formlayout.html.twig

有没有一种方法可以在其中使用与 form 一起提供的变量?

例如,当我发送到 index.html.twig

array ('form' => $formView, 'var' => $var);

Var 仅在 index.html.twig 中定义。

那么如何让var定义在formlayout.html.twig

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    如果你不使用 symphony 而是使用它自己的 twig,它很简单:

    <?php
    
    $loader = new \Twig_Loader_Filesystem('path/to/templates');
    $twig = new \Twig_Environment($loader);
    $twig->addGlobal('key1', 'var1');
    $twig->addGlobal('key2', 'var2');
    

    【讨论】:

    • 谢谢你。我不使用 Symfony,并且一直在寻找此信息。
    【解决方案2】:

    为了在 Twig 中设置一个全局变量,我创建了一个服务调用“@get_available_languages”(返回一个数组),然后在我的 kernel.request 事件类上实现了以下内容:

      class LocaleListener implements EventSubscriberInterface
    {
        private $defaultLocale;
    
        public function __construct($defaultLocale = 'en',       ContainerInterface $container)
        {
            $this->defaultLocale = $defaultLocale;
            $this->container = $container;
        }
    
        public function onKernelRequest(GetResponseEvent $event)
        {
            //Add twig global variables
            $this->addTwigGlobals();
    
    
        }
    
    
    
        public function addTwigGlobals(){
    
            //Add avaialble language to twig template as a global variable
            $this->container->get('twig')->addGlobal('available_languages', $this->container->get('get_available_languages'));
    
        }
    
        public static function getSubscribedEvents()
        {
            return array(
                // must be registered before the default Locale listener
                KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
            );
        }
    }
    

    【讨论】:

    • 你不应该在这里注入整个容器,只需要请求的服务。
    【解决方案3】:

    你可以使用addGlobal()方法。

    例如在我使用的 BaseController 中:

    $this->get('twig')->addGlobal('is_test', $isTest);
    

    所以在你的情况下,你可能应该这样做:

    $this->get('twig')->addGlobal('var', $var);
    

    【讨论】:

    • 你是在 BaseController 的构造函数中添加它还是以其他方式添加它?
    • 如何覆盖全局变量?
    • 根据code addGlobal @slier (以及其他想知道如何覆盖它们的人)只是一个数组赋值,所以它也会覆盖
    【解决方案4】:

    更好的例子:

    您可以转移所有的 $_GET、$_POST 和 $_SESSION,这样:

    $twig->addGlobal('session', $_SESSION);
    $twig->addGlobal('get', $_GET);
    $twig->addGlobal('post', $_POST);
    

    【讨论】:

    • 请分享更多细节。为什么在任何地方都需要这个?直接在模板中访问这些变量是一个很好的迹象,表明您的模板与这些变量过于紧密,而不是使用请求对象之类的抽象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2017-03-05
    • 1970-01-01
    • 2011-08-20
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多