Vérifier si le modèle existe avant le rendu
y a-t-il un moyen de vérifier si le modèle de brindille existe avant d'appeler pour le rendu? Un bloc catch try semble ne pas fonctionner, du moins dans un environnement de développement, et de plus, je préfère un contrôle que le coût d'une exception.
Cette classe TwigEngine a une méthode exist (), mais n'a pas trouvé d'exemples d'utilisation.
Le service contenant le moteur twig, s'il est configuré par défaut, est un "modèle".
Dans votre contrôleur, procédez comme suit:
if ( $this->get('templating')->exists('AcmeDemoBundle:Foo:bar.html.twig') ) {
// ...
}
L’alternative serait d’attraper l’exception que la méthode render () lève comme ceci:
try {
$this->get('templating')->render('AcmeDemoBundle:Foo:bar.html.twig')
} catch (\Exception $ex) {
// your conditional code here.
}
Dans un contrôleur normal ...
$this->render('...')
est seulement un alias pour ...
$this->container->get('templating')->renderResponse($view, $parameters, $response);
... tandis que ...
$this->get('...')
... est un alias pour
$this->container->get('...')
Si vous devez vérifier l'existence d'un modèle à partir de modèles, vous devez utiliser les méthodes d'inclusion de tableau, comme décrit dans la documentation documentation :
{% include ['page_detailed.html', 'page.html'] %}
Le service templating
sera supprimé dans les futures versions de Symfony. La solution évolutive basée sur le service twig
est la suivante:
if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
// ...
}
Peut-être aussi une option:
{% include 'AcmeDemoBundle:Foo:bar.html.twig' ignore missing %}
L'addition ignore ignore indique à twig de ne rien faire, quand le modèle n'est pas trouvé.
Vous pouvez le faire de cette façon en utilisant l'injection de dépendance:
use Symfony\Component\Templating\EngineInterface;
public function fooAction(EngineInterface $templeEngine)
{
if ($templeEngine->exists("@App/bar/foo.html.twig")) {
// ...
}
// ...
}
Testé avec Symfony 3.4.