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.

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');

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.


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.


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.


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.


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 }

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.


-3

En confing.yml

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

En vista de ramita

# twig view
{{ version }}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.