Cómo obtener parámetros de configuración en Symfony2 Twig Templates

170

Tengo una plantilla Symfony2 Twig. Quiero generar el valor de un parámetro de configuración en esta plantilla de ramita (un número de versión). Por lo tanto, definí el parámetro de configuración de esta manera:

parameters:
    app.version: 0.1.0

Puedo usar este parámetro de configuración en Controladores, pero no tengo idea de cómo obtenerlo en mi plantilla Twig.

Timo Haberkern
fuente

Respuestas:

406

Puede usar la sustitución de parámetros en las ramas globales sección de de la configuración:

Parámetros config:

parameters:
    app.version: 0.1.0

Configuración de ramita:

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

Plantilla de ramita:

{{ version }}

Este método proporciona el beneficio de permitirle usar el parámetro también en ContainerAwareclases, usando:

$container->getParameter('app.version');
Ryall
fuente
Buena respuesta. Anexo: desde Symfony 3.1 se debe citar una variable: "% app.version%"
BigJ
@BigJ: actualizado para incluir citas, ya que esto también funcionará en versiones anteriores.
Ryall
2
Esta definitivamente debería ser la respuesta aceptada. Gracias !
Cyrille
191

Fácilmente, puede definir en su archivo de configuración:

twig:
    globals:
        version: "0.1.0"

Y accede a ella en tu plantilla con

{{ version }}

De lo contrario, debe ser una forma con una extensión Twig para exponer sus parámetros.

webda2l
fuente
28
Es mejor configurarlo en parámetros como @Ryall explicó.
MrGlass
89

También puede aprovechar el sistema de parámetros de servicio incorporado, que le permite aislar o reutilizar el valor:

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

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

Ahora, la variable ga_tracking está disponible en todas las plantillas de Twig:

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

El parámetro también está disponible dentro de los controladores:

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

También puede definir un servicio como una variable global Twig (Symfony2.2 +):

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

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

Si la variable global que desea establecer es más complicada, digamos un objeto, no podrá usar el método anterior. En su lugar, deberá crear una extensión Twig y devolver la variable global como una de las entradas en el método getGlobals.

Francesco Casula
fuente
55
Esta parece ser la mejor solución porque mantiene todos los conocimientos del sistema juntos.
Jānis Gruzis
19

En versiones más nuevas de Symfony2 (usando un en parameters.ymllugar deparameters.ini ), puede almacenar objetos o matrices en lugar de pares clave-valor, para que pueda administrar sus globales de esta manera:

config.yml (editado solo una vez):

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

parámetros.yml:

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

Y luego, en un archivo de ramita, puede usar {{ project.version }}o {{ project.name }}.

Nota: Personalmente no me gusta agregar cosas app, solo porque esa es la variable de Symfony y no sé qué se almacenará allí en el futuro.

Alain Tiemblo
fuente
16

Las respuestas anteriores son correctas y funcionan bien. Solía ​​de una manera 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

Plantilla interior / archivo de ramita:

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

Para usar la salida del controlador:

Controlador:

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

archivo de plantilla / ramita:

Project version {{ app_version }}

Mencioné los diferentes para entender mejor.

Sudhakar Krishnan
fuente
1
Sí, bueno, esta respuesta explica muy bien en ambos sentidos: pasar a través del controlador y pasarlo como una variable global de ramita. +1
Gottlieb Notschnabel
12

Con una extensión Twig, puede crear una parameterfunción 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 }
Thomas Decaux
fuente
Gracias por esto, me preocupaba tener que duplicar el parámetro del archivo de parámetros a las ramas globales.
Joe Yahchouchi
Bien, pero no es una sobrecarga innecesaria, ¿extraer todo el contenedor a la extensión para un parámetro?
Lajdák Marek
Creo que con Symfony 2, no puede inyectar parámetros de contenedor (que ahora es posible con Symfony 4/5)
Thomas Decaux
1

Simplemente puede vincular el $this->getParameter('app.version')controlador a twig param y luego renderizarlo.

Jean-Luc Barat
fuente
-3

En confing.yml

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

En vista de ramita

# twig view
{{ version }}
Le Petit Monde de Purexo
fuente
2
dar acceso a todo el contenedor de servicios no es una buena idea. el contenedor es un localizador de servicios y ni siquiera debería inyectarse con inyección de dependencia, así que tampoco en ramita
Paul Andrieux