如何在Symfony2 Twig模板中获取配置参数


170

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

parameters:
    app.version: 0.1.0

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

Answers:


406

您可以在配置的“ 全局树枝”部分中使用参数替换:

参数配置:

parameters:
    app.version: 0.1.0

树枝配置:

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

树枝模板:

{{ version }}

此方法的优点是允许您也使用以下ContainerAware类在类中使用参数:

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

好答案。附录:自Symfony 3.1以来,必须引用一个变量:“%app.version%”
BigJ

@BigJ:已更新为包含引号,因为这在旧版本中也适用。
Ryall

2
这绝对应该是公认的答案。谢谢 !
西里尔(Cyrille)

191

您可以轻松地在配置文件中定义:

twig:
    globals:
        version: "0.1.0"

并使用

{{ version }}

否则,必须使用Twig扩展名来公开参数。


28
最好在像@Ryall这样的参数中进行设置。
MrGlass

89

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

# 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

如果您要设置的全局变量比较复杂-比如说一个对象-那么您将无法使用上述方法。相反,您需要创建一个Twig扩展,并将全局变量作为getGlobals方法中的条目之一返回。


5
这看起来是最好的解决方案,因为它将所有系统知识整合在一起。
贾尼斯·格鲁吉斯(JānisGruzis)

19

在较新版本的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

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

注意:我个人不喜欢向中添加内容app,只是因为这是Symfony的变量,而且我不知道将来将在此存储什么。


16

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

配置文件

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 }}

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


1
是的,这个答案很好地解释了两种方式:通过控制器传递并将其作为全局树枝变量传递!+1
Gottlieb Notschnabel

12

使用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 }

为此,我担心我不得不将参数从参数文件复制到树枝全局变量。
Joe Yahchouchi

很好,但这不是不必要的重载,可以将整个容器扩展为一个参数吗?
Lajdák马立克

我相信使用Symfony 2,您不能注入容器参数(现在可以使用Symfony 4/5注入容器参数)
Thomas Decaux


-3

在confing.yml中

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

在树枝视图中

# twig view
{{ version }}

2
授予访问整个服务容器的权限不是一个好主意。该容器是一个服务定位器,甚至不应该使用依赖项注入来注入它,所以在
分支中
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.