The TwigServiceProvider provides integration with the Twig template engine.
FormServiceProvider
is enabled).Twig_Environment
instance. The main way of
interacting with Twig.twig.path
and the twig.templates
options. You can also replace the loader
completely.1 2 3 | $app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__.'/views',
));
|
Note
Twig comes with the "fat" Silex archive but not with the regular one. If you are using Composer, add it as a dependency:
1 | composer require twig/twig
|
Symfony provides a Twig bridge that provides additional integration between some Symfony components and Twig. Add it as a dependency:
1 | composer require symfony/twig-bridge
|
When present, the TwigServiceProvider
will provide you with the following
additional capabilities:
UrlGeneratorServiceProvider
, you will have access to the path()
and
url()
functions. You can find more information in the Symfony Routing
documentation.TranslationServiceProvider
, you will get the trans()
and
transchoice()
functions for translation in Twig templates. You can find
more information in the Symfony Translation documentation.FormServiceProvider
, you
will get a set of helpers for working with forms in templates. You can find
more information in the Symfony Forms reference.SecurityServiceProvider
, you will have access to the is_granted()
function in templates. You can find more information in the Symfony
Security documentation.The Twig provider provides a twig
service:
1 2 3 4 5 | $app->get('/hello/{name}', function ($name) use ($app) {
return $app['twig']->render('hello.twig', array(
'name' => $name,
));
});
|
This will render a file named views/hello.twig
.
In any Twig template, the app
variable refers to the Application object.
So you can access any service from within your view. For example to access
$app['request']->getHost()
, just put this in your template:
1 | {{ app.request.host }}
|
A render
function is also registered to help you render another controller
from a template:
1 2 3 4 5 6 7 | {{ render(app.request.baseUrl ~ '/sidebar') }}
{# or if you are also using the UrlGeneratorServiceProvider #}
{{ render(url('sidebar')) }}
{# or you can reference a controller directly without defining a route for it #}
{{ render(controller(controller)) }}
|
Note
You must prepend the app.request.baseUrl
to render calls to ensure
that the render works when deployed into a sub-directory of the docroot.
Note
Read the Twig reference for Symfony document to learn more about the various Twig functions.
Silex\Application\TwigTrait
adds the following shortcuts:
1 2 3 4 5 6 | return $app->render('index.html', ['name' => 'Fabien']);
$response = new Response();
$response->setTtl(10);
return $app->render('index.html', ['name' => 'Fabien'], $response);
|
1 2 3 4 | // stream a view
use Symfony\Component\HttpFoundation\StreamedResponse;
return $app->render('index.html', ['name' => 'Fabien'], new StreamedResponse());
|
1 | $content = $app->renderView('index.html', ['name' => 'Fabien']);
|
You can configure the Twig environment before using it by extending the
twig
service:
1 2 3 4 5 6 | $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;
}));
|
For more information, check out the official Twig documentation.