【问题标题】:How to get config parameters in Symfony2 Twig Templates如何在 Symfony2 Twig 模板中获取配置参数
【发布时间】:2011-10-10 21:37:52
【问题描述】:

我有一个 Symfony2 Twig 模板。我想在这个树枝模板中输出一个配置参数的值(一个版本号)。因此我定义了这样的配置参数:

parameters:
    app.version: 0.1.0

我可以在控制器中使用此配置参数,但我不知道如何在我的 Twig 模板中获取它。

【问题讨论】:

    标签: symfony configuration twig


    【解决方案1】:

    很容易,您可以在配置文件中定义:

    twig:
        globals:
            version: "0.1.0"
    

    并在您的模板中访问它

    {{ version }}
    

    否则它必须是一种带有 Twig 扩展的方式来公开你的参数。

    【讨论】:

    • 最好在@Ryall 解释的参数中设置它。
    【解决方案2】:

    您可以在配置的twig globals 部分使用参数替换:

    参数配置:

    parameters:
        app.version: 0.1.0
    

    树枝配置:

    twig:
        globals:
            version: '%app.version%'
    

    树枝模板:

    {{ version }}
    

    此方法的好处是允许您在ContainerAware 类中使用参数,使用:

    $container->getParameter('app.version');
    

    【讨论】:

    • 好答案。附录:从 Symfony 3.1 开始,必须引用一个变量:“%app.version%”
    • @BigJ:更新为包含引号,因为这也适用于旧版本。
    • 这绝对应该是公认的答案。谢谢!
    【解决方案3】:

    您还可以利用内置的服务参数系统,它可以让您隔离或重用值:

    # app/config/parameters.yml
    parameters:
        ga_tracking: UA-xxxxx-x
    
    # app/config/config.yml
    twig:
        globals:
            ga_tracking: "%ga_tracking%"
    

    现在,变量 ga_tracking 在所有 Twig 模板中都可用:

    <p>The google tracking code is: {{ ga_tracking }}</p>
    

    该参数在控制器内部也可用:

    $this->container->getParameter('ga_tracking');
    

    您还可以将服务定义为全局 Twig 变量(Symfony2.2+):

    # app/config/config.yml
    twig:
        # ...
        globals:
            user_management: "@acme_user.user_management"
    

    http://symfony.com/doc/current/templating/global_variables.html

    如果你要设置的全局变量更复杂——比如一个对象——那么你将无法使用上述方法。相反,您需要 create a Twig Extension 并将全局变量作为 getGlobals 方法中的条目之一返回。

    【讨论】:

    • 这看起来是最好的解决方案,因为它将系统的所有知识集中在一起。
    【解决方案4】:

    在较新版本的 Symfony2 上(使用 parameters.yml 而不是 parameters.ini),您可以存储对象或数组而不是键值对,因此您可以通过这种方式管理全局变量:

    config.yml(只编辑一次):

    # app/config/config.yml
    twig:
      globals:
        project: %project%
    

    parameters.yml:

    # app/config/parameters.yml
    project:
      name:       myproject.com
      version:    1.1.42
    

    然后在 twig 文件中,您可以使用 {{ project.version }}{{ project.name }}

    注意:我个人不喜欢在app 中添加东西,因为那是 Symfony 的变量,我不知道将来会在那里存储什么。

    【讨论】:

      【解决方案5】:

      上面给出的答案是正确的并且工作正常。我以不同的方式使用。

      config.yml

      imports:
          - { resource: parameters.yml }
          - { resource: security.yml }
          - { resource: app.yml }
          - { resource: app_twig.yml }
      

      app.yml

      parameters:
        app.version:           1.0.1
      

      app_twig.yml

      twig:
        globals:
          version: %app.version%
      

      控制器内部:

      $application_version = $this->container->getParameter('app.version');
      // Here using app.yml
      

      模板/树枝文件内:

      Project version {{ version }}!
      {#  Here using app_twig.yml content.  #}
      {#  Because in controller we used $application_version  #}
      

      使用控制器输出:

      控制器:

      public function indexAction() {
              $application_version = $this->container->getParameter('app.version');
              return array('app_version' => $application_version);
          }
      

      模板/树枝文件:

      Project version {{ app_version }}
      

      我提到了不同之处以便更好地理解。

      【讨论】:

      • 是的,很好,这个答案很好地解释了两种方式:通过控制器传递并将其作为全局 twig 变量传递! +1
      【解决方案6】:

      您可以简单地将控制器中的$this-&gt;getParameter('app.version') 绑定到 twig 参数,然后进行渲染。

      【讨论】:

        【解决方案7】:

        使用 Twig 扩展,您可以创建 parameterTwig 函数:

        {{ parameter('jira_host') }}
        

        TwigExtension.php:

        class TwigExtension extends \Twig_Extension
        {
            public $container;
        
            public function getFunctions()
            {
                return [
                    new \Twig_SimpleFunction('parameter', function($name)
                    {
                        return $this->container->getParameter($name);
                    })
                ];
            }
        
        
            /**
             * Returns the name of the extension.
             *
             * @return string The extension name
             */
            public function getName()
            {
                return 'iz';
            }
        }
        

        service.yml:

          iz.twig.extension:
            class: IzBundle\Services\TwigExtension
            properties:
              container: "@service_container"
            tags:
              - { name: twig.extension }
        

        【讨论】:

        • 谢谢你,我担心我不得不将参数文件中的参数复制到树枝全局变量中。
        • 很好,但它不是不必要的重载将整个容器拉到一个参数的扩展?
        • 我相信使用 Symfony 2,你不能注入容器参数(现在 Symfony 4/5 可以实现)
        【解决方案8】:

        在confing.yml中

        # app/config/config.yml
        twig:
          globals:
            version: '%app.version%'
        

        在树枝视图中

        # twig view
        {{ version }}
        

        【讨论】:

        • 授予对整个服务容器的访问权限并不是一个好主意。容器是一个服务定位器,它甚至不应该被注入依赖注入,所以在 twig 中也不应该
        • @PaulAndrieux 只是出于兴趣:如果只是为一些低调的变量做这件事,为什么会这么糟糕?
        猜你喜欢
        • 2011-11-28
        • 2012-05-20
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多