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

Tim*_*imo 162 configuration symfony twig

我有一个Symfony2 Twig模板.我想在此twig模板中输出config参数的值(版本号).因此我定义了config参数,如下所示:

parameters:
    app.version: 0.1.0
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*all 396

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

参数配置:

parameters:
    app.version: 0.1.0
Run Code Online (Sandbox Code Playgroud)

Twig配置:

twig:
    globals:
        version: '%app.version%'
Run Code Online (Sandbox Code Playgroud)

树枝模板:

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

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

$container->getParameter('app.version');
Run Code Online (Sandbox Code Playgroud)

  • 亲爱的Nat,谢谢你,詹姆斯. (2认同)
  • 这绝对应该是公认的答案.谢谢 ! (2认同)

web*_*a2l 188

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

twig:
    globals:
        version: "0.1.0"
Run Code Online (Sandbox Code Playgroud)

并使用.在模板中访问它

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

否则,它必须是具有Twig扩展名的方式来公开您的参数.

  • 最好在@Ryall解释的参数中设置它. (28认同)

Fra*_*ula 88

您还可以利用内置的Service Parameters系统,该系统允许您隔离或重用该值:

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"
Run Code Online (Sandbox Code Playgroud)

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

<p>The google tracking code is: {{ ga_tracking }}</p>
Run Code Online (Sandbox Code Playgroud)

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

$this->container->getParameter('ga_tracking');
Run Code Online (Sandbox Code Playgroud)

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

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这看起来是最好的解决方案,因为它将系统的所有知识保持在一起. (5认同)

Ala*_*blo 19

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

config.yml(仅编辑一次):

# app/config/config.yml
twig:
  globals:
    project: %project%
Run Code Online (Sandbox Code Playgroud)

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42
Run Code Online (Sandbox Code Playgroud)

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

注:我个人不喜欢添加东西app,只是因为这是Symfony的的变量,我不知道会不会有在未来存储.


Sud*_*nan 16

上面给出的ans是正确的,并且工作正常.我以不同的方式使用.

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }
Run Code Online (Sandbox Code Playgroud)

app.yml

parameters:
  app.version:           1.0.1
Run Code Online (Sandbox Code Playgroud)

app_twig.yml

twig:
  globals:
    version: %app.version%
Run Code Online (Sandbox Code Playgroud)

内控制器:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml
Run Code Online (Sandbox Code Playgroud)

里面的模板/树枝文件:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}
Run Code Online (Sandbox Code Playgroud)

要使用控制器输出:

控制器:

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

模板/树枝文件:

Project version {{ app_version }}
Run Code Online (Sandbox Code Playgroud)

我提到了不同的更好理解.


Tho*_*aux 12

使用Twig扩展,您可以创建parameterTwig功能:

{{ parameter('jira_host') }}
Run Code Online (Sandbox Code Playgroud)

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)