2015-02-12 21 views
8

Bardzo często używam helpera response(), a ja po prostu zwracam dane z wiadomością do użytkownika. Teraz muszę dołączyć również kod statusu HTTP, ale nie chcę zmieniać każdej odpowiedzi (co i tak jest złe).Zastępowanie funkcji pomocnika laravel 5

Próbuję zastąpić funkcję pomocniczą response(), tworząc własną helpers.php w obrębie app/Http/helpers.php.

Kiedy dodać go do moich plików kompozytor, robi autoLoad aktualny helpers.php z ram pierwszy i kiedy dodać go przed autload obejmują w bootstrap/global.php przyzwyczajenie będę mógł korzystać z funkcji app() i inne laravel.

Jak mogę rozwiązać ten problem? Chcę tylko dołączyć kod statusu do tablicy odpowiedzi.

Odpowiedz

3

ja nie zamierzam bezpośrednio odpowiedzieć na to pytanie, ponieważ nie wiem, czy istnieje rozwiązanie (bez zmiany Laravels helpers.php lub zmiany nazwy funkcji)

Jednak istnieje rozwiązanie z ram dla tego wspólnego użytku walizka. Response Macros

Można zdefiniować makro (odbywa się to w usługodawcę)

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

I można go używać tak:

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

Jeśli potrzebujesz dodatkowej pomocy przy pisaniu aktualnego makra, muszę wiedzieć, co dokładnie ma robić ... – lukasgeiter

+0

Wiem, że można to zrobić w ten sposób, ale chciałbym się dowiedzieć, czy ktoś ma rozwiązanie zamiast zmieniać każdą metodę lub tworzyć inną. Laravel powinien być flexibel dla tego rodzaju rzeczy. – guidsen

+0

OK. Może ktoś inny ma rozwiązanie ... – lukasgeiter

12

Wszystko laravel funkcje pomocnicze napisane z tą logiką

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

dla pierwszego testu Laravel to ta funkcja istnieje, jeśli istnieje, Lara vel nie zdefiniuje tej funkcji ponownie (w przeciwnym razie spowoduje błąd krytyczny). Jeśli więc zdefiniujesz swoją funkcję przed autoloaderem, to plik vendor/laravel/framework/src/Illuminate/Foundation/helpers.php, , możesz zdefiniować swoją własną funkcję odpowiedzi.

Niestety nie ma sposobu, aby powiedzieć kompozytorowi najpierw załadować sekcję autoload.files, a następnie laravel autoload.files. Ale można zrobić małą siekać ...

bootstrap/autoload.php otwarty plik i podać swój plik przed autoloaderze

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

Nie mogę wtedy użyć instancji aplikacji, ponieważ jest ona ładowana później .. – guidsen

+0

Możesz użyć instancji aplikacji w funkcji, ponieważ wywołasz funkcję później, gdy instancja aplikacji istnieje. –

2

Właśnie miałem to zrobić, aby przesłonić now() pomocnika więc mogę kontrolować pozorna czas przeprowadzania testów. I po regular advice tworzenia app/Http/helpers.php a następnie dodanie go do bootstrap/autoload.php tak:

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

To zazwyczaj działa, ponieważ jak mówi Marty, wszyscy pomocnicy są zdefiniowane tylko wtedy, gdy nie jest istniejąca funkcja o tej nazwie. Tak więc powyższe dwa wiersze ładują twoich niestandardowych pomocników, a następnie wykonaj automatyczne ładowanie wszystkich dostawców, które obejmuje pomocników Laravel, a twoja już zdefiniowana funkcja ma pierwszeństwo.

Niestety, wydaje się, że autoload.php nie jest używany podczas testowania z Behat, którego używam. Potrzebowałem więc alternatywnego rozwiązania. Krótko mówiąc, jedynym prostym sposobem na zapewnienie automatycznego ładowania plików przed plikami dostawców za pomocą pakietu https://github.com/funkjedi/composer-include-files.Aby zacytować jego readme:

W przeszłości wystarczyło zmodyfikować bootstrap/autoload.php, aby dołączyć pomocników. Jednak nowe wersje PHPUnit zawierają Composer Autoloader przed wykonaniem pliku bootstrap PHPUnit. W związku z tym ta metoda zastępowania helperów nie jest już możliwa, ponieważ spowoduje błąd krytyczny po dołączeniu pliku bootstrap.

Więc zainstalowany ten pakiet za pomocą composer require funkjedi/composer-include-files a następnie dodaje do tego composer.json:

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

Po dokonaniu rejestracji, należy uruchomić composer dump-autoload regenerować pliki automatycznego uruchamiania. Teraz przesłonięcia działają zarówno podczas zwykłej pracy aplikacji, jak i podczas testów!