Como obter parâmetros de configuração no Symfony2 Twig Templates


170

Eu tenho um modelo Symfony2 Twig. Eu quero gerar o valor de um parâmetro de configuração neste modelo de galho (um número de versão). Portanto, eu defini o parâmetro de configuração assim:

parameters:
    app.version: 0.1.0

Eu sou capaz de usar esse parâmetro de configuração nos controladores, mas não tenho idéia de como obtê-lo no meu modelo Twig.

Respostas:


406

Você pode usar a substituição de parâmetro na seção twig globals da configuração:

Configuração de parâmetro:

parameters:
    app.version: 0.1.0

Configuração do Twig:

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

Modelo de galho:

{{ version }}

Este método fornece o benefício de permitir que você use o parâmetro também nas ContainerAwareclasses, usando:

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

Boa resposta. Adendo: desde o Symfony 3.1, uma variável deve ser citada: "% app.version%"
BigJ 16/16/16

@BigJ: atualizado para incluir aspas, pois isso também funcionará em versões mais antigas.
Ryall 16/05

2
Definitivamente, essa deve ser a resposta aceita. Obrigado !
Cyrille

191

Facilmente, você pode definir em seu arquivo de configuração:

twig:
    globals:
        version: "0.1.0"

E acesse-o no seu modelo com

{{ version }}

Caso contrário, deve haver uma maneira com uma extensão Twig para expor seus parâmetros.


28
Melhor configurá-lo em parâmetros como o @Ryall explicou.
precisa

89

Você também pode aproveitar o sistema interno de Parâmetros de Serviço, que permite isolar ou reutilizar o valor:

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

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

Agora, a variável ga_tracking está disponível em todos os modelos do Twig:

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

O parâmetro também está disponível dentro dos controladores:

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

Você também pode definir um serviço como uma variável global do Twig (Symfony2.2 +):

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

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

Se a variável global que você deseja definir for mais complicada - digamos, um objeto -, você não poderá usar o método acima. Em vez disso, você precisará criar uma extensão Twig e retornar a variável global como uma das entradas no método getGlobals.


5
Essa parece a melhor solução, pois mantém todo o conhecimento do sistema unido.
Jānis Gruzis

19

Nas versões mais recentes do Symfony2 (usando um em parameters.ymlvez de parameters.ini), é possível armazenar objetos ou matrizes em vez de pares de valores-chave, para que você possa gerenciar seus globais desta maneira:

config.yml (editado apenas uma vez):

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

parameters.yml:

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

E então, em um arquivo galho, você pode usar {{ project.version }}ou {{ project.name }}.

Nota: Pessoalmente, não gosto de adicionar coisas app, apenas porque essa é a variável do Symfony e não sei o que será armazenado lá no futuro.


16

O ans acima indicado está correto e funciona bem. Eu usei de uma maneira diferente.

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%

Controlador interno:

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

Arquivo de modelo / galho interno:

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

Para usar a saída do controlador:

Controlador:

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

arquivo de modelo / galho:

Project version {{ app_version }}

Eu mencionei o diferente para entender melhor.


1
Sim, legal, essa resposta explica muito bem os dois lados: passando pelo controlador e passando como uma variável global galho! 1
Gottlieb Notschnabel 24/10

12

Com uma extensão Twig, você pode criar uma parameterfunção Twig:

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

Obrigado por isso, fiquei preocupado que eu tivesse que duplicar o parâmetro do arquivo de parâmetros para os galhos globais.
Joe Yahchouchi

Bom, mas não é uma sobrecarga desnecessária puxar o contêiner inteiro para a extensão de um parâmetro?
Lajdák Marek 25/01

Acredito que com o Symfony 2, você não pode injetar parâmetros de contêiner (que agora é possível com o Symfony 4/5)
Thomas Decaux

1

Você pode simplesmente ligar o $this->getParameter('app.version')controlador a twig param e depois renderizá-lo.


-3

Em confing.yml

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

Na exibição Twig

# twig view
{{ version }}

2
dar acesso a todo o contêiner de serviço não é uma boa ideia. o recipiente é um localizador de serviço e não deve mesmo ser injetados com a injeção de dependência, então, nem em galho
Paul Andrieux
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.