Ich benutze den Helfer response()
sehr oft und gebe die Daten einfach mit einer Nachricht an den Benutzer zurück. Jetzt muss ich auch den http-Status-Code einfügen, aber ich möchte nicht jede Antwort ändern (was wahrscheinlich sowieso schlecht ist).
Also versuche ich die response()
Hilfsfunktion zu überschreiben, indem ich meine eigene helpers.php
innerhalb app/Http/helpers.php
erstelle.
Wenn ich es zu meinen Composer-Dateien hinzufüge, wird die aktuelle helpers.php automatisch aus dem Framework geladen und wenn ich sie vor dem automatischen Laden in bootstrap/global.php
hinzufüge, kann ich app()
und andere Laravel nicht verwenden Funktionen.
Wie könnte ich dieses Problem lösen? Ich möchte nur den Statuscode in das Antwortfeld einfügen.
Alle Laravel-Hilfsfunktionen, die mit dieser Logik geschrieben wurden
%Vor% für die erste Laravel-Prüfung ist diese Funktion vorhanden, falls sie existiert, wird Laravel diese Funktion nicht erneut definieren (andernfalls wird ein schwerwiegender Fehler ausgelöst).
Wenn Sie also vor dem Autoloader die Funktion vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
file definieren,
Sie können Ihre benutzerdefinierte Antwortfunktion definieren.
Leider gibt es keine Möglichkeit zu sagen, dass der Composer zuerst den Abschnitt autoload.files
laravel autoload.files
laden soll. Aber du kannst einen kleinen Hack machen ...
Öffnen Sie die Datei bootstrap/autoload.php
und fügen Sie Ihre Datei vor dem Autoloader ein
Ich werde deine Frage nicht direkt beantworten, da ich nicht weiß, ob es eine Lösung gibt (ohne Laravels helpers.php
zu ändern oder deine Funktion umzubenennen)
Allerdings gibt es eine Lösung aus dem Framework für diesen gemeinsamen Anwendungsfall. Antwortmakros
Sie können ein Makro definieren (dies geschieht in einem Service Provider)
%Vor%Und Sie können es so verwenden:
%Vor% Ich musste dies nur tun, um den now()
-Helfer zu überschreiben, damit ich die scheinbare Zeit beim Ausführen von Tests kontrollieren kann. Ich folgte dem Regelmäßigen Rat zum Erstellen von app/Http/helpers.php
und fügte es dann zu% hinzu. co_de% gefällt mir so:
Das funktioniert normalerweise, weil, wie Marty sagt, alle Helfer nur dann definiert sind, wenn es keine existierende Funktion mit diesem Namen gibt. Die beiden obigen Zeilen laden Ihre benutzerdefinierten Helfer und führen dann das Autoloading aller Hersteller durch, einschließlich Laravels Helfern, und Ihre bereits definierte Funktion hat Vorrang.
Aber leider wird bootstrap/autoload.php
nicht benutzt, wenn ich mit Behat teste, was ich verwende. Also brauchte ich eine alternative Lösung. Lange Rede, kurzer Sinn, der einzige einfache Weg, um sicherzustellen, dass Dateien vor Herstellerdateien automatisch geladen werden, indem Sie das Paket Ссылка verwenden. Um aus seiner Readme zu zitieren:
In der Vergangenheit war es einfach,
autoload.php
zu ändern, um Helfer einzubeziehen. Neue Versionen von PHPUnit enthalten jedoch den Composer Autoloader vor dem Ausführen der PHPUnit-Bootstrap-Datei. Folglich ist diese Methode des Überschreibens von Helfern nicht länger praktikabel, da sie einen fatalen Fehler auslösen wird, wenn Ihre Bootstrap-Datei enthalten ist.
Also habe ich dieses Paket mit bootstrap/autoload.php
installiert und dann zu composer require funkjedi/composer-include-files
hinzugefügt:
Sobald dies erledigt ist, führen Sie composer.json
aus, um die Autoload-Dateien neu zu generieren. Jetzt funktionieren die Überschreibungen sowohl während des normalen App-Vorgangs als auch während Tests!