Ver índice de contenidos del libro

A.13. TwigServiceProvider

El proveedor TwigServiceProvider integra la librería Twig para poder crear las plantillas de tu aplicación con este espectacular sistema de plantillas.

A.13.1. Parámetros de configuración

El proveedor define los siguientes parámetros configurables:

  • twig.path (opcional): ruta (o array de rutas) donde se encuentran las plantillas de Twig.
  • twig.templates (opcional): array asociativo donde las claves del array son los nombres de las plantillas y los valores del array son los contenidos de las plantillas. Utiliza esta opción para definir las plantillas Twig directamente en un array en vez de en un archivo.
  • twig.options (opcional): array asociativo con las opciones de configuración de Twig.
  • twig.form.templates (opcional): array con las plantillas utilizadas para mostrar los formularios (esta opción sólo está disponible si el proveedor FormServiceProvider está activado).

A.13.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • twig: es una instancia de la clase Twig_Environment a través de la cual se interactúa con Twig.
  • twig.loader: es el servicio que carga las plantillas de Twig y que por tanto, utiliza las opciones twig.path y twig.templates explicadas anteriormente. Si lo deseas, puedes utilizar tu propio cargador de plantillas.

A.13.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/views',
));

Nota La librería Twig se incluye cuando descargas Silex en forma de archivo comprimido. Si instalas Silex mediante Composer, debes añadir esta dependencia ejecutando el siguiente comando:

$ composer require twig/twig

A.13.4. Integrando los componentes de Symfony

Symfony define un bridge para Twig que permite integrar varios componentes de Symfony2 en Twig. Para utilizarlo, añade la siguiente dependencia en tu aplicación:

$ composer require symfony/twig-bridge

Cuando el bridge de Twig está instalado, el proveedor TwigServiceProvider incluye las siguientes opciones:

  • UrlGeneratorServiceProvider: si haces uso de este proveedor, podrás utilizar las mismas funciones path() y url() disponibles en Symfony2.
  • TranslationServiceProvider: si haecs uso de este proveedor, también tendrás a tu disposición las funciones trans() y transchoice() para traducir contenidos en las plantillas Twig.
  • FormServiceProvider: si utilizas este proveedor, el bridge incluirá varias utilidades y helpers para facilitar el trabajo con los formularios en las plantillas.
  • SecurityServiceProvider: cuando utilices este proveedor, dispondrás de una nueva función llamada is_granted() con la que puedes comprobar los permisos de los usuarios desde las plantillas Twig.

A.13.5. Ejemplos de uso

Para renderizar plantillas creadas con Twig, utiliza el servicio twig proporcionado por este proveedor, tal y como muestra el siguiente ejemplo:

$app->get('/hello/{name}', function ($name) use ($app) {
    return $app['twig']->render('hello.twig', array(
        'name' => $name,
    ));
});

El código anterior hace que cuando el usuario solicite la URL indicada, obtenga como respuesta el resultado de renderizar la plantilla Twig que se encuentra definida en el archivo views/hello.twig.

A las plantillas Twig se les pasa automáticamente una variable llamada app que es una referencia al objeto Application. A través de esta variable puedes acceder a cualquier servicio de la aplicación directamente desde la plantilla. Para obtener el nombre del host en el que se ejecuta la aplicación (es decir, para obtener el resultado de ejecutar el método $app['request']->getHost()) utiliza el siguiente código en tu plantilla:

{{ app.request.host }}

Las plantillas también pueden hacer uso de una función llamada render() para incluir en cualquier punto de la plantilla el resultado de ejecutar otro controlador:

{{ render(app.request.baseUrl ~ '/sidebar') }}
 
{# si utilizas UrlGeneratorServiceProvider, el siguiente
   código es equivalente #}
{{ render(url('sidebar')) }}

Nota Si vas a instalar la aplicación Silex en un subdirectorio, prefija el valor app.request.baseUrl a cualquier URL incluida en la función render().

A.13.6. Traits

El trait Silex\Application\TwigTrait definido por este proveedor añade los siguientes atajos:

  • render: renderiza una plantilla utilizando los parámetros indicados y devuelve un objeto de tipo Response.
// método habitual para renderizar una plantilla
return $app->render('index.html', ['name' => 'Fabien']);
 
// renderizar una plantilla y utilizar opciones del objeto Response
$response = new Response();
$response->setTtl(10);
 
return $app->render('index.html', ['name' => 'Fabien'], $response);
 
// ...
 
// renderizar una plantilla y utilizar una respuesta de tipo "stream"
use Symfony\Component\HttpFoundation\StreamedResponse;
 
return $app->render('index.html', ['name' => 'Fabien'], new StreamedResponse());

A.13.7. Configuración

Extiende el servicio twig para configurar el entorno de Twig antes de utilizarlo, tal y como se muestra en el siguiente ejemplo:

$app['twig'] = $app->share($app->extend('twig', function($twig, $app) {
    $twig->addGlobal('pi', 3.14);
    $twig->addFilter('levenshtein', new \Twig_Filter_Function('levenshtein'));
 
    return $twig;
}));