web-dev-qa-db-fra.com

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.

34
K. Weber

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('...')

Regardez Symfony\FrameworkBundle\Controller\Controller .

65
nifr

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'] %}
18
silzenna

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')) {
    // ...
}
11
Javier Eguiluz

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é.

8
Sharpy35

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.

0
Mateusz