2015-02-12 15 views
8

Ich benutze den response() Helfer sehr oft und ich gebe nur die Daten mit einer Nachricht an den Benutzer zurück. Jetzt muss ich auch den http-Status-Code angeben, aber ich möchte nicht jede Antwort ändern (was wahrscheinlich sowieso schlecht ist).Laravel 5 Hilfsfunktion überschreiben

Also versuche ich die response() Hilfsfunktion zu überschreiben, indem ich meine eigene helpers.php innerhalb app/Http/helpers.php.

Als ich es meinen Komponist Datei hinzufügen, wird es automatisch geladen den aktuellen helpers.php aus dem Rahmen ersten und wenn ich es vor dem autload hinzufügen ist in bootstrap/global.php ich werde nicht in der Lage, die app() und andere Laravel Funktionen zu nutzen.

Wie könnte ich dieses Problem lösen? Ich möchte nur den Statuscode in das Antwortfeld aufnehmen.

Antwort

3

Ich werde nicht direkt Ihre Frage zu beantworten, da ich weiß nicht, ob eine Lösung gibt es (ohne Laravels Ändern helpers.php oder Umbenennen Ihrer Funktion)

Allerdings gibt es eine Lösung aus dem Rahmen für diese gemeinsame Nutzung Fall. Response Macros

Sie können ein Makro definieren (das in einem Service-Provider durchgeführt wird)

Response::macro('foo', function($value){ 
    // do some stuff 
    return Response::make($value); 
}); 

Und Sie können es wie folgt verwenden:

return response()->foo('bar'); 
+0

Wenn Sie mehr Hilfe brauchen, um das eigentliche Makro zu schreiben, müsste ich wissen, was genau es tun soll ... – lukasgeiter

+0

Nun, ich weiß, dass es so gemacht werden kann, aber ich würde gerne wissen, ob jemand eine Lösung hat anstatt nur jede Methode zu ändern oder eine andere zu erstellen. Laravel sollte für diese Art von Sachen flexibel sein. – guidsen

+0

Okay. Vielleicht hat jemand anderes eine Lösung ... – lukasgeiter

12

Alle Laravel Helferfunktionen mit dieser Logik geschrieben

if (! function_exists('response')) 
{ 
    function response($content = '', $status = 200, array $headers = array()) 
    { 
     // function body 
    } 
} 

für den ersten Laravel-Check ist diese Funktion vorhanden, wenn sie existiert, Lara vel wird diese Funktion nicht erneut definieren (andernfalls wird ein schwerwiegender Fehler ausgelöst). Also, wenn Sie Ihre Funktion definieren, bevor Autoloader enthalten vendor/laravel/framework/src/Illuminate/Foundation/helpers.php Datei, können Sie Ihre benutzerdefinierte Antwortfunktion definieren.

Leider gibt es keine Möglichkeit zu sagen Composer laden zuerst Ihre autoload.files Abschnitt, dann Laravel autoload.files. Aber man kann kleine Hack tun ...

offen bootstrap/autoload.php Datei und geben Sie Ihre Datei vor dem Autoloader

// file with your custom helper functions 
require __DIR__.'/../app/app/Http/helpers.php'; 
require __DIR__.'/../vendor/autoload.php'; 
+0

Ich kann die Anwendungsinstanz dann nicht verwenden, weil sie später geladen wird. – guidsen

+0

Sie können die Anwendungsinstanz in der Funktion verwenden, da Sie die Funktion später aufrufen werden, wenn eine Anwendungsinstanz vorhanden ist. –

2

Ich habe nur das tun, um die now() Helfer außer Kraft zu setzen, damit ich die scheinbare Kontrolle Zeit beim Ausführen von Tests. Ich folgte die regular advice von app/Http/helpers.php zu schaffen und dann zu bootstrap/autoload.php Zugabe etwa so:

require __DIR__.'/../app/Http/helpers.php'; // added 
require __DIR__.'/../vendor/autoload.php'; 

Dies funktioniert in der Regel, weil, wie Marty sagt, alle Helfer nur definiert werden, wenn es nicht eine vorhandene Funktion mit diesem Namen. Die beiden obigen Zeilen laden Ihre benutzerdefinierten Helfer und führen dann alle Autoloader-Funktionen aus, die die Helfer von Laravel enthalten, und Ihre bereits definierte Funktion hat Vorrang.

Aber leider scheint autoload.php nicht verwendet zu werden, wenn ich mit Behat teste, was ich benutze. 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 das Paket https://github.com/funkjedi/composer-include-files verwendet wird.Um von seiner Liesmich zu zitieren:

In der Vergangenheit war es einfach, bootstrap/autoload.php zu modifizieren, 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.

So installierte ich dieses Paket composer require funkjedi/composer-include-files verwenden und diese dann zu composer.json hinzugefügt:

"extra": { 
    "include_files": [ 
     "app/Http/helpers.php" 
    ] 
}, 

Einmal, das erledigt composer dump-autoload ausführen, um die Dateien automatisch geladen zu regenerieren. Jetzt funktionieren die Überschreibungen sowohl während des normalen App-Vorgangs als auch während Tests.