【问题标题】:Using an environment variable (from `.env` file) in custom Twig function in Symfony 4在 Symfony 4 的自定义 Twig 函数中使用环境变量(来自 `.env` 文件)
【发布时间】:2021-11-12 20:04:03
【问题描述】:

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

【问题讨论】:

标签: twig environment-variables symfony4 twig-extension


【解决方案1】:

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

GOOGLE_TAG_MANAGER_ID="GTM-AAA12XX"

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

twig:
    globals:
        google_tag_manager_id: '%env(GOOGLE_TAG_MANAGER_ID)%'

现在您可以像这样在 Twig 模板中使用标签管理器值:

{{ google_tag_manager_id }}

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

SetEnv GOOGLE_TAG_MANAGER_ID GTM-AAA12XX

我没有用 nginx 配置文件测试过东西,但我认为这应该可行:

fastcgi_param GOOGLE_TAG_MANAGER_ID "GTM-AAA12XX";

有关更多详细信息,请参阅 Configuration Based on Environment VariablesEnvironment Variable Processors 的 Symfony 文档。环境变量处理器可让您执行诸如修剪变量或设置默认值之类的操作。

【讨论】:

    【解决方案2】:

    安装Dotenv component,以便您可以使用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;
        }
    }
    

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

    <?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'),
            ];
        }
    }
    

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

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

    更好的函数名当然是例如getenv。这里我使用了my_function,这样我们自己的代码就不会和Dotenv组件提供的getenv()函数混淆了。

    如果未找到环境变量,getenv() 函数将返回 false

    【讨论】:

      【解决方案3】:

      无需任何额外配置即可访问 twig 模板中的环境变量:

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

      【讨论】:

      • 这工作得很好,但不支持参数中设置的默认值:env(MY_ENV_VAR): someDefaulValue 在这种情况下将被忽略。
      【解决方案4】:

      也使用 DotEnv,我只是选择了:

      $twig = new \Twig\Environment($loader); // or however you access your Twig instance.
      $twig->addFunction(
          new \Twig\TwigFunction('getenv', function ($key) {
              return getenv($key);
          })
      );
      

      然后在模板中我将使用{{ getenv('SOME_ENV_VARIABLE') }}

      【讨论】:

        【解决方案5】:

        现在你可以直接做。

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

        【讨论】:

          【解决方案6】:

          你可以像这样在项目的任何地方使用它

          $_ENV["APP_ENV"]
          

          【讨论】:

            【解决方案7】:

            将它作为全局变量添加到你的 twig.yaml 中,然后你可以在任何地方使用它:

            twig: 
              globals: 
                env: '%env(SYMFONY_ENV)%'
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-22
            • 2022-06-17
            • 2020-11-09
            • 2011-12-25
            • 2020-07-27
            • 2020-01-27
            • 2020-04-03
            相关资源
            最近更新 更多