it-swarm.com.de

Prüfen Sie vor dem Rendern, ob eine Vorlage vorhanden ist

gibt es eine Möglichkeit zu überprüfen, ob eine Zweigvorlage vorhanden ist, bevor der Render-Aufruf erfolgt? Ein try catch-Block scheint zumindest in der dev-Umgebung nicht zu funktionieren, und ich bevorzuge einen Check als die Kosten einer Ausnahme.

Diese Klasse TwigEngine hat eine exists () - Methode, konnte jedoch keine Beispiele für die Verwendung finden.

34
K. Weber

Der Dienst, der die Zweig-Engine enthält, wenn er als Standard konfiguriert ist, ist "Templating".

Führen Sie in Ihrem Controller Folgendes aus:

if ( $this->get('templating')->exists('AcmeDemoBundle:Foo:bar.html.twig') ) {
     // ...
}

Die Alternative wäre die Ausnahme, die die render () -Methode wie folgt auslöst:

 try {
      $this->get('templating')->render('AcmeDemoBundle:Foo:bar.html.twig')
  } catch (\Exception $ex) {
     // your conditional code here.
  }

In einem normalen Controller ...

$this->render('...')

ist nur ein Alias ​​für ...

$this->container->get('templating')->renderResponse($view, $parameters, $response);

... während ...

$this->get('...') 

... ist ein Alias ​​für

$this->container->get('...')

Schauen Sie unter Symfony\FrameworkBundle\Controller\Controller nach.

65
nifr

Wenn Sie die Existenz von Vorlagen in twig-Vorlagen überprüfen müssen, müssen Sie die Array-Include-Methoden verwenden, wie in der documentation beschrieben:

{% include ['page_detailed.html', 'page.html'] %}
18
silzenna

Der templating-Dienst wird in zukünftigen Symfony-Versionen entfernt. Die zukunftssichere Lösung, die auf dem Dienst twig basiert, ist:

if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
    // ...
}
11
Javier Eguiluz

Vielleicht auch eine Option:

{% include 'AcmeDemoBundle:Foo:bar.html.twig' ignore missing %}

Der fehlende Zusatz ignorieren weist twig an, einfach nichts zu tun, wenn die Vorlage nicht gefunden wird.

8
Sharpy35

Sie können dies mit Hilfe der Abhängigkeitseinspritzung tun:

use Symfony\Component\Templating\EngineInterface;

public function fooAction(EngineInterface $templeEngine)
{
    if ($templeEngine->exists("@App/bar/foo.html.twig")) {
        // ...
    }
    // ...
}

Getestet mit Symfony 3.4.

0
Mateusz