Ich benutze einen Laravel View Composer, um ein paar Variablen mit allen Ansichten zu teilen.
app/composers.php
:
Ich verstehe hier, dass alles, was layouts.base
benutzt, die Daten des View Composers bekommt.
BaseComposer@compose
, vereinfacht:
Gegeben ist layouts.base
:
$global->name
wird gefunden und das ist auch in der inkludierten layouts.partials.header
:
Aber eine Ansicht, die layouts.base
erweitert, löst einen Undefined variable: global
Fehler aus:
home.blade.php
Alles funktioniert gut, wenn ich composers.php
auf home
ändern:
Ich würde gerne verstehen, warum, wenn home
erweitert layouts.base
die View-Composer-Variablen ohne diesen zusätzlichen Schritt nicht sehen kann.
Das Problem ist hier die Reihenfolge, in der die Dinge passieren. Zeigen Sie Komponisten an, die aufgerufen werden, bevor die übereinstimmende Ansicht gerendert wird. Das bedeutet in Ihrem Fall:
home
wird gerendert layouts.base
wird aufgerufen layouts.base
wird gerendert Dies führt dazu, dass die Variable global
in der home
-Ansicht nicht verfügbar ist.
Hier sind einige Lösungen, die helfen können
Ändern Sie das Übereinstimmungsmuster Ihres Composers so, dass alle Ansichten enthalten sind, die die Variable benötigen. Nutzen Sie den Platzhalter *
wenn möglich.
Sie können sogar jede einzelne Ansicht anpassen:
Wenn Sie Ihre Daten in (fast) jeder Ansicht benötigen, können Sie View::share
beim Start der Anwendung verwenden.
Fügen Sie dies in app/filters.php
, app/start/global.php
oder eine ähnliche Datei
Warum benötigen verschiedene Ansichten dieselben globalen Daten? Könnten Sie vielleicht den Teil der Ansicht, der die Daten benötigt, in eine Teilansicht verschieben, die Sie dann einfügen können?