2015-05-01 3 views
5

Sto usando la funzione {{ dump(foo) }} in Twig per eseguire il debug dei miei modelli. Tuttavia, se il modello genera errori dopo la funzione dump(), vedrai solo la pagina di debug di Symfony che ti informa dell'errore. Puoi ovviamente commentare le linee di codice incriminate nel template Twig, ma c'è un modo per uccidere l'esecuzione del template immediatamente dopo in modo che l'output della funzione dump() sia l'ultima cosa stampata sullo schermo. Ingenuamente sto pensando a qualcosa come {{ dump(foo) }} {{ die() }}. Qualche idea su come potresti ottenere questo?Come uccidere l'esecuzione in Twig after dump()?

risposta

10

È possibile creare una semplice estensione di ramoscello che ha gestito questo.

Il file ramoscello ..

namespace Acme\SomeBundle\Twig; 

class DevExtension extends \Twig_Extension 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('die', 'die'), 
     ); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'acme_dev'; 
    } 
} 

Il file di servizi (YAML) ..

services: 
    acme.twig.dev_extension: 
     class: Acme\SomeBundle\Twig\DevExtension 
     tags: 
      - { name: twig.extension } 

Inoltre si poteva passare nel contesto attuale e poi o morire o fallire in silenzio a seconda l'ambiente nel caso in cui hai lasciato il dado nel tuo codice per qualche motivo.

tua estensione ramoscello ..

class DevExtension extends \Twig_Extension 
{ 
    /** 
    * @string 
    */ 
    private $environment; 

    /** 
    * @param string $environment 
    */ 
    public function __construct($environment) 
    { 
     $this->environment = $environment; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('die', array($this,'killRender')), 
     ); 
    } 

    /** 
    * @param string|null $message 
    */ 
    public function killRender($message = null) 
    { 
     if ('dev' === $this->environment) { 
      die($message); 
     } 

     return ''; 
    } 

    ... 
} 

Il file di servizi ..

services: 
    acme.twig.dev_extension: 
     class: Acme\SomeBundle\Twig\DevExtension 
     arguments: 
      - %kernel.environment% 
     tags: 
      - { name: twig.extension } 
+0

Questo è esattamente quello che speravo. Grazie. – trajan

+0

Ti darei un voto ma la mia reputazione è troppo bassa :( – trajan

+0

Non preoccuparti. – qooplmao

1

Non penso che dovresti interrompere l'esecuzione di PHP all'interno del tuo modello di ramoscello (anche se ciò è possibile usando un'estensione personalizzata di Twig). Il risultato non sarebbe quello che ti aspetteresti perché c'è molto di più tra il rendering del tuo modello e l'invio al browser. Se semplicemente interrompi l'esecuzione, tutto questo non accadrà più e sospetto che otterrai una semplice pagina bianca.

Forse è un approccio migliore per scaricare la variabile all'interno del controller. Ciò invierà l'output del dump alla barra degli strumenti del profiler web, disponibile anche sulla pagina degli errori di symfony.

Oh, beh, che ne dici di usare un commento ({# ... #}) per disabilitare la parte non funzionante del tuo modello?

+3

Grazie per la vostra consulenza. Apprezzo il punto sul dumping delle variabili all'interno dei controller. Tuttavia, in alcune situazioni (mi spiace, dovrei dare un esempio nella mia domanda) ottieni template incorporati e nuove variabili piuttosto complesse create all'interno dei modelli di Twig, quindi non puoi esporle davvero al di fuori del modello. Inoltre, si noti che la soluzione fornita da Qoop funziona come previsto, cioè il template è parzialmente renderizzato e tutto ciò che precede {{die()}} viene echeggiato. – trajan