2013-05-25 6 views
29

esiste un modo per verificare se il modello di ramoscello esiste prima di chiamare il rendering? Un blocco try catch sembra non funzionare, almeno in ambiente dev e, inoltre, preferisco un controllo rispetto al costo di un'eccezione.Verifica se il modello esiste prima del rendering

Questa classe TwigEngine ha un metodo exist(), ma non ha trovato esempi di utilizzo.

risposta

60

Il servizio che contiene il motore di ramoscello se configurato come predefinito è 'templating'.

All'interno del vostro controller procedere come segue:

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

L'alternativa sarebbe la cattura eccezione del render() metodo genera in questo modo:

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

In un controller normale ...

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

è solo un alias per ...

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

... mentre ...

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

... è un alias per

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

Dai un'occhiata alla Symfony\FrameworkBundle\Controller\Controller.

16

Nel caso in cui è necessario verificare la presenza di template esistenza da modelli ramoscello all'interno è necessario utilizzare la matrice includere metodi, come descritto nella documentation:

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

Questo è piuttosto utile sulla fine del modello. Può avere un modello vuoto per non fare nulla in modo sicuro quando tempate non c'è '' '{% include ['page_detailed.html', 'page.html', 'empty-catch-all.html']%}' '' – yuvilio

+0

Is c'è un modo per includere il modello se già non esiste solo? – Radhakrishna

+1

Imho questa è una soluzione più pulita, grazie – Prof83

5

Forse anche un'opzione:

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

L'ignora aggiunta mancante dice a twig di non fare semplicemente nulla, quando il modello non viene trovato.

+0

Non riesco a immaginare una situazione in cui ciò sarebbe utile, ma è comunque una cosa molto interessante da sapere. – aalaap

+0

è in caso di modelli caricati dinamicamente. Come se volessi includere un modello specifico con un nome specifico e questo modello con quel nome non esiste e non vuoi che venga visualizzato un 500 di questa è una possibile opzione – Sharpy35

+0

Grazie - usando questo per caricare dinamicamente i modelli come da commento sopra. – Michael

5

Il servizio templating verrà rimosso nelle future versioni di Symfony. La soluzione a prova di futuro sulla base del servizio è twig:

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

Si può fare in questo modo con l'iniezione di dipendenza:

use Symfony\Component\Templating\EngineInterface; 

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

testato con Symfony 3.4.