laravel Nie można przygotować trasy… do serializacji. Używa zamknięcia

85

Kiedy czyszczę pamięci podręczne w moim projekcie Laravel 5.2, widzę ten komunikat o błędzie:

[LogicException] Nie można przygotować trasy [panel] do serializacji. Używa zamknięcia.

Myślę, że jest to związane z trasą

Route::get('/article/{slug}', 'Front@slug');

związane z określoną metodą w moim kontrolerze:

public function slug($slug) {
    $article = Article::where('slug',$slug)->first();

    $id = $article ->id_article ;

    if ( ($article=== null) || (is_null($id)) ) return view('errors/Db');

    else return view('detail')->with(array('article'=> $article,  'title'=>'My title - '.$article->title)); 
}`

Krótko mówiąc, z widoku głównego przekazuję $ slug, czyli skrót do artykułu, za pomocą $ slug, który jest unikalny w bazie danych, identyfikuję rekord, a następnie przekazuję jego zawartość do widoku szczegółowego.

Nie miałem żadnego problemu, kiedy pisałem metodę, w rzeczywistości działała jak urok, ale po wyczyszczeniu pamięci podręcznych pojawia się ten błąd i linki w widoku głównym nie pokazują żadnego shortcode.

Gdzie ja robię źle?

Francesco
źródło
Proszę edytować swoje pytanie zawierać resztę swoich tras (zwłaszcza Trasa panel)
Chris Forrence

Odpowiedzi:

134

Myślę, że jest to związane z trasą

Route::get('/article/{slug}', 'Front@slug');

związane z określoną metodą w moim kontrolerze:

Nie, to nie to. Komunikat o błędzie pochodzi z route:cachepolecenia, nie jestem pewien, dlaczego wyczyszczenie pamięci podręcznej wywołuje to automatycznie.

Problemem jest trasa, która używa Closure zamiast kontrolera, co wygląda mniej więcej tak:

//                       Thats the Closure
//                             v 
Route::get('/some/route', function() {
    return 'Hello World';
});

Ponieważ zamknięć nie można serializować, nie można buforować tras w przypadku tras, które używają zamknięć.

tkausl
źródło
3
więc polecenie => php artisan route: cache nie działa na laravel? błąd?
robspin
3
@robspin Nie sądzę, że to błąd, ponieważ jest to wyraźnie powiedziane w dokumentach Laravel laravel.com/docs/5.7/deployment#optimization (sprawdź sekcję Optymalizacja ładowania trasy)
Anatoliy Arkhipov
4
Ponieważ ta funkcja wykorzystuje serializację PHP, możesz buforować trasy tylko dla aplikacji, które używają wyłącznie tras opartych na kontrolerze. PHP nie może serializować zamknięć. Więc nie używaj ścieżki rzemieślniczej php: pamięć podręczna to właściwa droga! Po prostu użyj pamięci podręcznej php artisan: wyczyść
robspin
2
więc jakieś rozwiązanie?
zukijuki
1
patrz rozwiązanie IBRAHIM EZZAT poniżej. Zasadniczo trzeba zastąpić wszystkie zamknięcia metodami kontrolera w plikach tras
Alistair R
52

Jeśli żadna z twoich tras nie zawiera zamknięć, ale nadal pojawia się ten błąd, sprawdź

route / api.php

Laravel ma domyślną trasę auth api w powyższym pliku.

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

które w razie potrzeby można skomentować lub zastąpić wywołaniem metody kontrolera.

Manpreet
źródło
37

To z pewnością błąd, ponieważ Laravel oferuje predefiniowany kod w plikach route / api.php

Route::middleware('auth:api')->get('/user', function (Request $request) { 
     return $request->user(); 
});

które nie mogą być przetwarzane przez:

php artisan route:cache

To zdecydowanie powinno zostać naprawione przez zespół Laravel. (Sprawdź link ),

po prostu jeśli chcesz to naprawić, powinieneś zamienić kod route \ api.php na coś takiego:

Route::middleware('auth:api')->get('/user', 'UserController@AuthRouteAPI');

aw UserController umieść tę metodę:

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }
IBRAHIM EZZAT
źródło
2
Rzeczywiście wygląda na błąd. Jeśli pozwalają na użycie domknięć w trasach, powinni naprawić polecenia rzemieślnika, aby przynajmniej nie podawały żadnych błędów.
Arno van Oordt
Oto odpowiedni PR, który został zamknięty :( github.com/laravel/laravel/pull/4601
William Turrell,
7

Rzeczywistym rozwiązaniem tego problemu jest zmiana pierwszego wiersza w web.php

Po prostu zastąp trasę powitalną następującą trasą

Route::view('/', 'welcome');

Jeśli nadal pojawia się ten sam błąd, niż prawdopodobnie

Akram Chauhan
źródło
6

Sprawdź swoje trasy / web.php i Routes / api.php

Laravel jest dostarczany z domyślnym zamknięciem trasy w route / web.php:

Route::get('/', function () {
    return view('welcome');
});

i route / api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

jeśli to usuniesz, spróbuj ponownie wyczyścić pamięć podręczną tras.

Pawan Verma
źródło
4

rozwiązanie, gdy korzystamy z takich tras:

Route::get('/', function () {
    return view('welcome');
});

Laravel nazywa je Zamknięciem, więc nie można optymalizować tras używanych jako Zamknięcia, których należy kierować do kontrolera php artisan optimize

stilo trochę
źródło
2

Jeśli ktoś nadal szuka odpowiedzi, to u mnie problem był w pliku route / web.php. Przykład:

Route::get('/', function () {
    return view('welcome');
});

To także Route, więc tak ... Po prostu usuń go, jeśli nie jest potrzebny i możesz jechać! Powinieneś także postępować zgodnie z odpowiedziami udzielonymi z góry.

Rozwój DM
źródło
1
Cześć Aline Matos, nie ma problemu. Zajęło mi cały dzień, aby dowiedzieć się, co jest nie tak ... Cieszę się, że pomogło.
DM rozwija
4
co jeśli to potrzebne?
Aziz
1
@Aziz po prostu przenieś go do kontrolera
Binar Web
0

sprawdź, czy Twój plik web.php ma to rozszerzenie

use Illuminate\Support\Facades\Route;

mój problem został rozwiązany w ten sposób.

pankaj kumar
źródło