在Symfony 4中的自定义Twig函数中使用环境变量(来自`.env`文件)

jpy*_*zio 11 environment-variables twig twig-extension symfony4

如何在Symfony 4 .env中的自定义Twig函数(\Twig_SimpleFunction)中使用文件中的环境变量?

lfj*_*eff 46

这是一种更简单的方法(Symfony 4),不涉及任何自定义扩展.就我而言,我想将Google跟踪代码管理器ID设置为.env文件中的环境变量:

GOOGLE_TAG_MANAGER_ID="GTM-AAA12XX"
Run Code Online (Sandbox Code Playgroud)

接下来,引用config/packages/twig.yaml文件中的环境变量:

twig:
    globals:
        google_tag_manager_id: '%env(GOOGLE_TAG_MANAGER_ID)%'
Run Code Online (Sandbox Code Playgroud)

现在,您可以在Twig模板中使用标记管理器值,如下所示:

{{ google_tag_manager_id }}
Run Code Online (Sandbox Code Playgroud)

对于生产系统,您可能没有.env文件.在这种情况下,在Apache配置文件中设置变量:

SetEnv GOOGLE_TAG_MANAGER_ID GTM-AAA12XX
Run Code Online (Sandbox Code Playgroud)

我没有使用nginx配置文件测试过,但我认为这应该有效:

fastcgi_param GOOGLE_TAG_MANAGER_ID "GTM-AAA12XX";
Run Code Online (Sandbox Code Playgroud)

  • @ThEBiShOp,两个答案在不同的背景下都很好 (4认同)

mar*_*ias 8

安装Dotenv组件,以便可以使用以下getenv()功能:

<?php
// src/Twig/AppExtension.php

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class AppExtension extends AbstractExtension
{
    public function getFunctions(): array
    {
        return [
            new TwigFunction('my_function', [$this, 'myFunction']),
        ];
    }

    public function myFunction($varname)
    {
        $value = getenv($varname);

        // Do something with $value...

        return $value;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果只想返回环境变量的值,则可以简化如下代码:

<?php
// src/Twig/AppExtension.php

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class AppExtension extends AbstractExtension
{
    public function getFunctions(): array
    {
        return [
            new TwigFunction('my_function', 'getenv'),
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都可以在Twig中执行以下操作:

{{ my_function('APP_ENV') }}

{% if my_function('MAILER_URL') == 'null://localhost' %}
    Mailer URL not set!
{% endif %}

{# etc. #}
Run Code Online (Sandbox Code Playgroud)

更好的函数名称当然是getenv。在这里,我使用my_function了我们的代码,以免将其与getenv()Dotenv组件提供的功能混淆。

如果找不到环境变量,则该getenv()函数返回false


Gan*_*net 6

可以在没有任何额外配置的情况下访问树枝模板中的环境变量:

{{ app.request.server.get('MY_ENV_VAR') }}

  • 这工作得很好,但不支持参数中设置的默认值:“env(MY_ENV_VAR): someDefaulValue”在这种情况下将被忽略。 (2认同)