Laravel 5 Hilfsfunktion überschreiben

8

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.

    
guidsen 12.02.2015, 10:10
quelle

3 Antworten

12

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

%Vor%     
Marty Aghajanyan 12.02.2015 11:12
quelle
3

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%     
lukasgeiter 12.02.2015 10:15
quelle
2

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:

%Vor%

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:

%Vor%

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!

    
Daniel Buckmaster 29.12.2017 08:58
quelle

Tags und Links