laravel Route kann nicht vorbereitet werden… für die Serialisierung. Verwendet Closure

81

Wenn ich Caches in meinem Laravel 5.2-Projekt lösche, wird folgende Fehlermeldung angezeigt:

[LogicException] Route [Panel] kann nicht für die Serialisierung vorbereitet werden. Verwendet Closure.

Ich denke, dass es mit einer Route zusammenhängt

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

mit einer bestimmten Methode in meinem Controller verbunden:

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)); 
}`

Kurz gesagt, aus einer Master-Ansicht übergebe ich $ slug, dh einen Shortlink zum Artikel, mit $ slug, der in der Datenbank eindeutig ist. Ich identifiziere den Datensatz und übergebe seinen Inhalt an die Detailansicht.

Ich hatte kein Problem, als ich die Methode schrieb, tatsächlich funktionierte sie wie ein Zauber, aber nachdem ich die Caches bereinigt habe, erhalte ich diesen Fehler und die Links in der Master-Ansicht zeigen keinen Shortcode.

Wo mache ich falsch?

Francesco
quelle
Bitte bearbeiten Sie Ihre Frage, um den Rest Ihrer Routen (insbesondere die Panel-Route)
einzuschließen

Antworten:

130

Ich denke, dass es mit einer Route zusammenhängt

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

mit einer bestimmten Methode in meinem Controller verbunden:

Nein, das ist es nicht. Die Fehlermeldung kommt vom route:cacheBefehl, nicht sicher, warum das Löschen des Caches dies automatisch aufruft.

Das Problem ist eine Route, die anstelle eines Controllers einen Closure verwendet, der ungefähr so ​​aussieht:

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

Da Closures nicht serialisiert werden können, können Sie Ihre Routen nicht zwischenspeichern, wenn Sie Routen haben, die Closures verwenden.

tkausl
quelle
3
Also der Befehl => PHP Artisan Route: Cache funktioniert nicht auf Laravel? ein Käfer?
Robspin
3
@robspin Ich denke nicht, dass es ein Fehler ist, da es ausdrücklich in Laravel docs laravel.com/docs/5.7/deployment#optimization gesagt wird ( siehe Abschnitt Optimieren des Routenladens )
Anatoliy Arkhipov
4
Da diese Funktion die PHP-Serialisierung verwendet, können Sie die Routen nur für Anwendungen zwischenspeichern, die ausschließlich Controller-basierte Routen verwenden. PHP kann Closures nicht serialisieren. Verwenden Sie also nicht die PHP Artisan Route: Cache ist der richtige Weg! Verwenden Sie einfach den PHP
Artisan
1
Also, irgendeine Lösung?
Zukijuki
siehe IBRAHIM EZZAT-Lösung unten. Im Wesentlichen müssen alle Verschlüsse durch Controller-Methoden in Ihren Routendateien ersetzt werden
Alistair R
51

Wenn keine Ihrer Routen Sperrungen enthält, Sie aber dennoch diesen Fehler erhalten, überprüfen Sie dies bitte

Routen / api.php

Laravel hat in der obigen Datei eine Standard-Auth-API-Route.

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

Diese kann bei Bedarf kommentiert oder durch einen Aufruf der Controller-Methode ersetzt werden.

Manpreet
quelle
34

Dies ist definitiv ein Fehler. Larvel bietet vordefinierten Code in route / api.php

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

die nicht verarbeitet werden kann von:

php artisan route:cache

Dies sollte auf jeden Fall vom Laravel-Team behoben werden (siehe Link ).

Wenn Sie das Problem beheben möchten, sollten Sie einfach den Code route \ api.php durch Folgendes ersetzen:

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

und in UserController setzen Sie diese Methode:

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }
IBRAHIM EZZAT
quelle
1
Scheint in der Tat wie ein Fehler. Wenn sie es ermöglichen, Verschlüsse in Routen zu verwenden, sollten sie die handwerklichen Befehle so korrigieren, dass sie zumindest keine Fehler geben.
Arno van Oordt
Hier ist die relevante PR, die geschlossen wurde :( github.com/laravel/laravel/pull/4601
William Turrell
6

Überprüfen Sie Ihre Routen / web.php und Routen / api.php

Laravel wird standardmäßig in der Datei route / web.php geschlossen:

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

und Routen / api.php

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

Wenn Sie das entfernen, versuchen Sie erneut, den Routen-Cache zu löschen.

Pawan Verma
quelle
6

Die eigentliche Lösung dieses Problems besteht darin, die erste Zeile in web.php zu ändern

Ersetzen Sie einfach die Begrüßungsroute durch die folgende Route

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

Wenn immer noch der gleiche Fehler als Sie wahrscheinlich

Akram Chauhan
quelle
4

die Lösung, wenn wir Routen wie diese verwenden:

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

Laravel nennt sie Closure, sodass Sie die Verwendung von Routen nicht optimieren können. Closures müssen Sie zur Verwendung an den Controller weiterleiten php artisan optimize

Stilo Bit
quelle
2

Wenn noch jemand nach einer Antwort sucht, lag das Problem für mich in der Datei route / web.php. Beispiel:

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

Es ist auch Route, also ja ... Entfernen Sie es einfach, wenn es nicht benötigt wird, und Sie können loslegen! Sie sollten auch den Antworten von oben folgen.

DM Entwicklung
quelle
1
Hallo Aline Matos, kein Problem. Ich habe den ganzen Tag gebraucht, um herauszufinden, was los ist ... Ich bin froh, dass es geholfen hat.
DM Entwicklung
3
Was ist, wenn es gebraucht wird?
Aziz
1
@ Aziz verschiebe es einfach in einen Controller
Binar Web
0

Überprüfen Sie, ob Ihre web.php- Datei diese Erweiterung hat

use Illuminate\Support\Facades\Route;

Mein Problem wurde auf diese Weise behoben.

Pankaj Kumar
quelle