2016-05-19 4 views
6

Ich habe eine Vorlage Zweig Symfony3 wie die Verwendung von follwing:Warum wirft Zweig Vorlage unbekannte "Dump" -Funktion bei der Verwendung von If-Anweisung für 'Dev' Umgebung?

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

Aber in der 'prod' -Umgebung es diesen Fehler wirft, in der var/log/prod.log Datei gezeigt:

[2016-05-18 21:28:28] request.CRITICAL: Uncaught PHP Exception Twig_Error_Syntax: "Unbekannte" Dump "-Funktion in " search/search_pet_results.html.twig "in Zeile 13." unter /var/www/html/petition/vendor/twig/twig/lib/Twig/ExpressionParser.php Zeile 573 {"Ausnahme": "[Objekt] (Twig_Error_Syntax (Code: 0): Unbekannt \" dump \ "Funktion in \" search/search_pet_results.html.twig \ "in Zeile 13. um /var/www/html/petion/vendor/twig/twig/lib/Twig/ExpressionParser.php:573)"} []

Irgendwelche Vorschläge für meine Zweigvorlage? Ich weiß nicht, was ich versuchen soll, denn das soll "funktionieren".

+1

sieht für mich aus wie Ihre Umgebung nicht richtig eingestellt ist! Haben Sie versucht auszugeben, was "app.environment" in Produktion ist? Änderungen werden auf dev gesetzt :) – Phorce

+0

Hallo da @Phorce. Wenn ich '

Anwendungsumgebung: {{app.environment}}

' in meiner Zweigdatei anschließe, wird "Anwendungsumgebung: dev" für meinen Link "app_dev.php" angezeigt, und für meine normale Produktumgebung wird "Anwendungsumgebung" angezeigt : prod ". –

Antwort

3

Die Dump-Funktion ist standardmäßig nicht verfügbar, wie im Dokument here beschrieben. Sie müssen das Debug-Flag auf "True" setzen, um die Umgebung zu aktivieren. Das Flag befindet sich in den Dateien config.yml unter dem Zweigabschnitt. Normalerweise wird der Wert vom Kernel-Wert übernommen.

So wahrscheinlich ist Ihr config.yml wie folgt gleiche:

config.yml

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

Versuchen zu modifizieren zu folgen, um in der ganzen Umgebung zu ermöglichen:

Config .ym

# Twig Configuration 
twig: 
    debug:   true 

Hope this help

+0

Hallo da Matteo. Danke für die Hilfe, aber ich habe die Änderung vorgenommen und das hat nicht funktioniert. Ich habe auch 'php bin/console cache: clear' sowohl für Dev- als auch für Prod-Umgebungen ausgeführt. In meiner config.yml habe ich auch strict_variables: "% kernel.debug%" 'unter twig: config. –

+0

Ich sollte auch erwähnen, dass {{dump (students)}} 'in meiner 'dev'-Umgebung gut funktioniert; also sollte es nicht nötig sein, es zu "aktivieren" -> wenn du das meintest. Irgendwelche anderen Vorschläge? Mein Problem ist mit dem "wenn" nicht richtig funktioniert. –

1

Der Fehler in der Prod-Umgebung tritt auf, weil der Dump-Aufruf nicht verfügbar ist.

Sie müssen debug jedoch nicht auf true setzen, da dies normalerweise nicht in der prod-Umgebung erfolgen soll.
Es gibt eine sehr einfache und viel bessere Problemumgehung für dieses Problem.

Anstatt dump() direkt im if-Block aufzurufen, fügen Sie einfach eine separate Zweigdatei ein, die den dump()-Aufruf enthält.

Änderung:

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

in:

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

dump.html.twig Inhalt:

{{ dump(foo) }} 
0

Dies ist vergleichbar mit der Frage Check if a custom Twig function exists and then call it, die ich vor kurzem beantwortet.Ich habe festgestellt, dass Twig eine Twig_Error_Syntax Ausnahme auslöst, wenn versucht wird, eine Funktion aufzurufen, die nicht existiert, auch wenn sie sich in einem unerreichbaren if Block befindet. So wie in deiner Frage.

Eigentlich sagt Symfony's documentation of dumping die gleiche:

konstruktions die dump() Funktion in den dev und test Umgebungen nur verfügbar ist, zu vermeiden, sensible Informationen in Produktion undicht. Wenn Sie versuchen, die dump()-Funktion in der Umgebung zu verwenden, führt dies zu einem PHP-Fehler.

So löschen Sie entweder alle dump s aus Ihren Twig-Dateien oder erstellen Sie eine Problemumgehung.

würde ich dump ausnehmen nichts in Produktionsumgebungen zu tun - so ich eine benutzerdefinierte Zweig Funktion namens schaffen würde dump, die nichts zurückliefert. Die Antwort von edditor funktioniert möglicherweise auch, aber das Erstellen separater Dateien für jeden Dump-Aufruf scheint ziemlich beschwerlich zu sein, zumindest wenn Sie dump an mehreren Stellen verwendet haben.

Leider weiß ich nicht, in welcher Position Ihrer Codebasis Sie eine neue Funktion hinzufügen sollten, die nur in Produktionsumgebungen verwendet werden soll. Aber hier ist das Rindfleisch:

$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; 
    })); 
} 

Dann sicher Sie dump in allen Umgebungen verwenden können; In Produktionsumgebungen gibt es einfach nichts aus, aber auch keine Ausnahmen.

Verwandte Themen