2016-05-19 26 views
6

Ho un modello ramoscello utilizzando Symfony3 come il follwing:Perché il modello di ramoscello lancia una funzione di "dump" sconosciuta quando si utilizza if statement for 'dev' environment?

{% if app.environment == 'dev' %} 
    {{ dump(students) }} 
{% endif %} 

Ma nell'ambiente 'prod' si getta questo errore, indicato in/log/file di prod.log var:

[2016-05-18 21:28:28] request.CRITICAL: Eccezione PHP non rilevata Twig_Error_Syntax: funzione "dump" sconosciuta "in " search/search_pet_results.html.twig "alla riga 13." a /var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php riga 573 {"eccezione": "[oggetto] (Twig_Error_Syntax (codice: 0): sconosciuto \" dump \ "function in \" search/search_pet_results.html.twig \ "alla riga 13. at /var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php:573)"} []

Qualche suggerimento per il mio modello di ramoscello? Non so cosa provare, perché questo è "supposto" funzionare.

+1

mi sembra che l'ambiente non sia impostato correttamente! Hai provato a produrre ciò che "app.environment" è in produzione? Le modifiche saranno impostate su dev :) – Phorce

+0

Salve @Phorce. quando aggiungo '

Ambiente applicazione: {{app.environment}}

' nel mio file di ramoscello, mostra "Ambiente applicazione: dev" per il mio collegamento "app_dev.php", e per il mio normale ambiente di produzione mostra "Ambiente applicazione : prod ". –

risposta

3

La funzione dump non è disponibile per impostazione predefinita, come descritto nel documento here. È necessario impostare il flag di debug su true per abilitare sull'ambiente. La bandiera si trova nei file config.yml, sotto la sezione ramoscello. Solitamente il valore è preso dal valore del kernel.

Quindi probabilmente il tuo config.yml è lo stesso come segue:

config.yml

# Twig Configuration 
twig: 
    debug:   "%kernel.debug%" 

Prova modificare come seguire al fine di consentire a tutti gli ambienti:

config .yml

# Twig Configuration 
twig: 
    debug:   true 

Spero che questo aiuto

+0

Ciao, Matteo. Grazie per l'aiuto, ma ho apportato la modifica e questo non ha funzionato. Ho anche eseguito 'php bin/console cache: clear' per entrambi gli ambienti dev e prod. Nel mio file config.yml ho anche 'strict_variables:"% kernel.debug% "' sotto twig: config. –

+0

Dovrei anche ricordare che '{{dump (students)}}' funziona bene nel mio ambiente 'dev'; quindi non dovrebbe esserci la necessità di "abilitarlo" -> se è questo che intendevi. Qualche altro suggerimento? Il mio problema è con il "se" non funziona correttamente. –

1

L'errore nell'ambiente prod si visualizza perché la chiamata di dump non è disponibile.

Ma non è necessario impostare il debug su true, perché di solito non si desidera eseguire questo in ambiente prod.
C'è una soluzione molto semplice e molto migliore per questo problema.

Invece di chiamare dump() direttamente nel blocco if, includere solo un file ramoscello separato che contiene la chiamata dump().

cambiamento:

{% if app.environment == 'dev' %} 
    {{ dump(foo) }} 
{% endif %} 

in:

{% if app.environment == 'dev' %} 
    {% include 'dump.html.twig' %} 
{% endif %} 

contenuti dump.html.twig:

{{ dump(foo) }} 
0

Questo è simile alla domanda Check if a custom Twig function exists and then call it che ho recentemente risposto.Ho scoperto che Twig genera un'eccezione Twig_Error_Syntax quando tenta di chiamare una funzione che non esiste, anche se si trova all'interno di un blocco non accessibile if. Quindi, proprio come nella tua domanda.

In realtà, Symfony's documentation of dumping dice lo stesso:

In base alla progettazione, la funzione dump() è disponibile solo negli ambienti dev e test, per evitare la fuoriuscita di informazioni sensibili in produzione. Infatti, provare ad utilizzare la funzione dump() nell'ambiente prod provocherà un errore PHP.

Quindi eliminare tutti i dump s dai file Twig o creare una soluzione alternativa.

avrei tranne dump di non fare nulla in ambienti di produzione - così vorrei creare una funzione di Twig personalizzata denominata dump che non restituisce nulla. La risposta di edditor potrebbe anche funzionare, ma la creazione di file separati per ogni chiamata di dump sembra abbastanza complicata, almeno se si è utilizzato dump in più di un posto.

Purtroppo, non so in quale posizione del codice base si debba aggiungere una nuova funzione da utilizzare solo negli ambienti di produzione. Ma ecco la carne bovina:

$twig = new Twig_Environment(/* ... */); 

// Pseudo code: check environment 
if ($environment !== 'dev' && $environment !== 'test') { 
    $twig->addFunction(new Twig_Function('dump', function() { 
     return null; 
    })); 
} 

// Or you can also check whether the `dump` function already exists 
if ($twig->getFunction('dump') === false) { 
    $twig->addFunction(new Twig_Function('dump', function() { 
     return null; 
    })); 
} 

quindi è possibile utilizzare in modo sicuro dump in tutti gli ambienti; negli ambienti di produzione non emette semplicemente nulla ma non genera eccezioni.