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 proveedorFormServiceProvider
está activado).
A.13.2. Servicios proporcionados
El proveedor proporciona los siguientes servicios:
twig
: es una instancia de la claseTwig_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 opcionestwig.path
ytwig.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 funcionespath()
yurl()
disponibles en Symfony2.TranslationServiceProvider
: si haecs uso de este proveedor, también tendrás a tu disposición las funcionestrans()
ytranschoice()
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 llamadais_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 tipoResponse
.
// 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;
}));