2013-05-25 6 views
29

Gibt es eine Möglichkeit zu überprüfen, ob eine Zweigvorlage vor dem Aufruf zum Rendern existiert? Ein try-catch-Block scheint zumindest in der Entwicklungsumgebung nicht zu funktionieren, und außerdem bevorzuge ich eine Überprüfung als die Kosten einer Ausnahme.Überprüfen, ob die Vorlage vor dem Rendern existiert

Diese Klasse TwigEngine hat eine exists() -Methode, fand aber keine Beispiele zur Verwendung.

Antwort

60

Der Dienst, der die Zweig-Engine als Standardkonfiguration enthält, ist "Templating".

Innerhalb der Controller wie folgt vor:

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

Die Alternative die Ausnahme render() Methode wirft wie folgt kontrollieren würde:

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

einen Blick auf Symfony\FrameworkBundle\Controller\Controller haben.

16

Im Fall, dass Sie für eine Vorlage existance von innen Zweig Vorlagen überprüfen Sie das Array verwenden haben, gehören Methoden, wie sie in den documentation beschrieben:

{% include ['page_detailed.html', 'page.html'] %} 
+0

Dies ist ziemlich praktisch auf der Vorlage Ende. Kann eine leere Vorlage haben, um sicher nichts zu tun, wenn tempate nicht da ist '' '{% include ['page_detailed.html', 'page.html', 'empty-catch-all.html']%}' '' – yuvilio

+0

ist Gibt es eine Möglichkeit, die Vorlage einzubinden, wenn sie nicht schon existiert? – Radhakrishna

+1

Imho dies ist eine sauberere Lösung, danke – Prof83

5

Vielleicht auch eine Option:

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

Der ignorierende fehlende Zusatz sagt dem Zweig, einfach nichts zu tun, wenn die Vorlage nicht gefunden wird.

+0

Ich kann mir nicht vorstellen, eine Situation, wo dies nützlich wäre, aber es ist immer noch eine sehr interessante Sache zu wissen. – aalaap

+0

ist es in Fällen von dynamisch geladenen Vorlagen. Wenn Sie beispielsweise eine bestimmte Vorlage mit einem bestimmten Namen einschließen möchten und diese Vorlage mit diesem Namen nicht existiert und Sie keine 500 kommen möchten, dann ist dies eine mögliche Option. – Sharpy35

+0

Vielen Dank, dass Sie die Vorlagen dynamisch wie in den Kommentaren laden über. – Michael

5

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

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

Sie können es auf diese Weise tun Dependency Injection mit:

use Symfony\Component\Templating\EngineInterface; 

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

Getestet mit Symfony 3.4.