Exponer de forma global valores de config.yml en las plantillas de Twig en aplicaciones Symfony2

Supongamos que has creado un bundle que tiene una configuración específica dentro del fichero config.yml (esto se hace exponiendo configuraciones semánticas). Por ejemplo los idiomas que soporta tu aplicación:

acme_demo:
    languages:
        en: English
        es: Spanish (Español)

Podrías hacer que todos los controladores leyeran esa configuración mediante el container interface y expusieran el valor a las plantillas de esta forma:

// src/Acme/DemoBundle/Controller/AcmeController.php
$this->languages = $this->container->getParameter('acme_demo.languages');
    }

    public function indexAction()
    {
        return $this->render('AcmeDemoBundle:Default:index.html.twig',
                array('languages' => $this->languages)
        );
    }
}
// src/Acme/DemoBundle/Resources/views/Default/index.html.twig
{% for lang, language in languages %}
                    {{ lang }} - {{ language }}
{% endfor %}

Pero esto sería MUY tedioso. Una solución mucho mejor es crear una extensión Twig que exponga esa configuración leída de container interface como si se hubiera definido en el fichero config.yml dentro de la sección twig:globals:

// src/Acme/DemoBundle/Twig/LanguageExposeExtension.php
container = $container;
    }
    
    public function getGlobals()
    {
        return array(
            'languages' => $this->container->getParameter('acme_demo.languages')
        );
    }
    
    public function getName()
    {
        return 'language_expose_extension';
    }
}

Por supuesto hay que registrar esta extensión de Twig como un servicio usando el tag twig.extension:

// src/Acme/DemoBundle/Resources/config/services.yml
services:
    acme.twig.language_expose_extension:
        class: Acme\DemoBundle\Twig\LanguageExposeExtension
        arguments: []
        tags:
            - { name: twig.extension }

Ahora ya puedes eliminar el parámetro language en la llamada a render porque dicha variable está definida de forma global para todas las plantillas.

Tal vez también te guste

Instalar y activar xdebug en MacPorts
First install php5-xdebug: sudo port install php5-xdebug Then just add these in your php.ini (probably...
Symfony2 – ErrorException: Notice: serialize() [function.serialize]: “xxx” returned as member variable from __sleep() but does not exist in …
While storing an entity from Doctrine2 in the session under a Symfony2 application I got this error: ErrorException:...
Arreglar “Cannot redeclare class Symfony\…” en Symfony2 después de actualizar
After upgrading from Symfony 2.2 to 2.3 I got this error in my application: Fatal error: Cannot redeclare...
Aumentar el timeout de sesión de phpMyAdmin
Edit your config.inc.php file (in my Ubuntu 12.04 it was located at /etc/phpmyadmin/config.inc.php) and...
Dejar un comentario?

0 Comentarios.

Deje un comentario