107 votes

laravel Impossible de préparer la route ... pour la sérialisation. Utilise Closure

Lorsque je vide les caches dans mon projet Laravel 5.2, je vois ce message d'erreur :

[LogicException] Impossible de préparer la route [panel] pour la sérialisation. Utilise Closure.

Je pense que c'est lié à une route.

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

associé à une méthode particulière de mon contrôleur :

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

En bref, à partir d'une vue principale, je passe $slug, qui est un lien court vers l'article, avec $slug , qui est unique dans la base de données, j'identifie l'enregistrement et ensuite je passe son contenu à la vue détaillée.

Je n'ai pas eu de problème lorsque j'ai écrit la méthode, en fait elle a fonctionné comme un charme, mais après avoir nettoyé les caches, j'obtiens cette erreur et les liens dans la vue principale ne montrent aucun shortcode.

Où est-ce que je me trompe ?

0 votes

S'il vous plaît modifier votre question pour inclure le reste de vos itinéraires (en particulier l'itinéraire du panneau)

158voto

tkausl Points 7822

Je pense que c'est lié à une route.

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

associé à une méthode particulière de mon contrôleur :

Non, ce n'est pas ça. Le message d'erreur provient du route:cache Je ne sais pas pourquoi l'effacement du cache appelle cette commande automatiquement.

Le problème est une route qui utilise un Closure au lieu d'un contrôleur, qui ressemble à quelque chose comme ceci :

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

Comme les closures ne peuvent pas être sérialisées, vous ne pouvez pas mettre en cache vos routes lorsque vous avez des routes qui utilisent des closures.

3 votes

Donc la commande => php artisan route:cache ne fonctionne pas sur laravel ? un bug ?

3 votes

@robspin Je ne pense pas qu'il s'agisse d'un bug, puisque c'est explicitement dit dans la documentation Laravel. laravel.com/docs/5.7/deployment#optimisation (voir la section Optimisation du chargement des routes)

4 votes

Comme cette fonctionnalité utilise la sérialisation PHP, vous ne pouvez mettre en cache les routes que pour les applications qui utilisent exclusivement des routes basées sur des contrôleurs. PHP n'est pas capable de sérialiser les Closures. Il est donc préférable de ne pas utiliser la fonction php artisan route:cache ! Utilisez simplement la fonction php artisan cache:clear

64voto

Manpreet Points 660

Si aucun de vos itinéraires ne contient de fermetures, mais que vous obtenez toujours cette erreur, vérifiez les points suivants

routes/api.php

Laravel a une route auth api par défaut dans le fichier ci-dessus.

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

qui peut être commenté ou remplacé par un appel à la méthode du contrôleur si nécessaire.

0 votes

C'est la bonne réponse, quand je commente les fonctions Route/api.php Route, cette erreur a disparu. Merci Manpreet.

51voto

IBRAHIM EZZAT Points 73

Laravel propose un code prédéfini dans routes/api.php.

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

qui n'est pas autorisé à être traité par :

php artisan route:cache

Ce problème devrait être corrigé par l'équipe de Laravel (vérifiez la page d'accueil du site). lien ),

simplement si vous voulez le réparer vous devez remplacer les routes \api.php avec quelque chose comme :

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

et dans UserController mettez cette méthode :

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }

3 votes

Cela ressemble à un bug en effet. S'ils rendent possible l'utilisation de fermetures dans les itinéraires, ils devraient corriger les commandes artisanales pour qu'elles ne donnent au moins aucune erreur.

0 votes

Voici le PR correspondant, qui a été fermé :( github.com/laravel/laravel/pull/4601

0 votes

Cela a fonctionné pour moi ! Tks

11voto

Akram Chauhan Points 195

La solution réelle de ce problème est de changer la première ligne dans web.php.

Il suffit de remplacer la route Welcome par la route suivante

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

Si vous obtenez toujours la même erreur, il est probable que vous

6voto

stilo bit Points 116

La solustion lorsque nous utilisons des routes comme celle-ci :

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

laravel les appelle Closure donc vous ne pouvez pas optimiser l'utilisation des routes comme des Closures vous devez router vers le contrôleur pour l'utiliser. php artisan optimize

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X