laravel No se puede preparar la ruta ... para la serialización. Usa cierre

81

Cuando borro las cachés en mi proyecto Laravel 5.2, veo este mensaje de error:

[LogicException] No se puede preparar la ruta [panel] para la serialización. Utiliza cierre.

Creo que esta relacionado con una ruta

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

asociado con un método particular en mi controlador:

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 resumen, desde una vista maestra paso $ slug, que es un enlace corto al artículo, con $ slug, que es único en la base de datos, identifico el registro y luego paso su contenido a la vista detallada.

No tuve ningún problema cuando escribí el método, de hecho funcionó como un encanto, pero después de limpiar las cachés, aparece ese error y los enlaces en la vista maestra no muestran ningún código corto.

¿Dónde estoy haciendo mal?

Francesco
fuente
Por favor, editar su pregunta para incluir el resto de sus rutas (especialmente la ruta panel)
Chris Forrence

Respuestas:

130

Creo que esta relacionado con una ruta

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

asociado con un método particular en mi controlador:

No eso no es. El mensaje de error proviene del route:cachecomando, no estoy seguro de por qué borrar el caché lo llama automáticamente.

El problema es una ruta que usa un cierre en lugar de un controlador, que se parece a esto:

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

Dado que los cierres no se pueden serializar, no puede almacenar en caché sus rutas cuando tiene rutas que utilizan cierres.

tkausl
fuente
3
entonces el comando => php artisan route: cache no funciona en laravel? ¿un insecto?
robspin
3
@robspin No creo que sea un error, ya que se dice explícitamente en los documentos de Laravel laravel.com/docs/5.7/deployment#optimization (consulte la sección Optimización de la carga de ruta)
Anatoliy Arkhipov
4
Dado que esta función utiliza la serialización PHP, solo puede almacenar en caché las rutas para aplicaciones que utilizan exclusivamente rutas basadas en controladores. PHP no puede serializar cierres. Así que no use la ruta artesanal de php: ¡la caché es la manera correcta! Solo use el caché php artisan: clear
robspin
2
entonces, alguna solucion?
zukijuki
consulte la solución IBRAHIM EZZAT a continuación. Esencialmente necesita reemplazar cualquier cierre con métodos de controlador en sus archivos de ruta
Alistair R
51

Si ninguna de sus rutas contiene cierres, pero sigue recibiendo este error, consulte

rutas / api.php

Laravel tiene una ruta de auth api predeterminada en el archivo anterior.

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

que se puede comentar o reemplazar con una llamada al método del controlador si es necesario.

Manpreet
fuente
34

Esto definitivamente es un error Laravel ofrece código predefinido en route / api.php

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

que no puede ser procesado por:

php artisan route:cache

Esto definitivamente debería ser arreglado por el equipo de Laravel. (Verifique el enlace ),

simplemente, si desea solucionarlo, debe reemplazar el código route \ api.php con algo como:

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

y en UserController pon este método:

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }
IBRAHIM EZZAT
fuente
1
De hecho, parece un error. Si posibilitan el uso de cierres en las rutas, entonces deberían corregir los comandos artesanales para que al menos no den errores.
Arno van Oordt
Aquí está el PR relevante, que se cerró :( github.com/laravel/laravel/pull/4601
William Turrell
6

Verifique sus rutas / web.php y rutas / api.php

Laravel viene con un cierre de ruta predeterminado en routes / web.php:

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

y rutas / api.php

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

si lo elimina, intente nuevamente borrar el caché de ruta.

Pawan Verma
fuente
6

La solución real de este problema es cambiar la primera línea en web.php

Simplemente reemplace la ruta de bienvenida con la siguiente ruta

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

Si sigue recibiendo el mismo error que probablemente

Akram Chauhan
fuente
4

la solustion cuando usamos rutas como esta:

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

laravel los llama Closure para que no pueda optimizar los usos de las rutas, ya que los cierres deben enrutar al controlador para usar php artisan optimize

poco stilo
fuente
2

Si alguien todavía está buscando una respuesta, para mí el problema estaba en el archivo routes / web.php. Ejemplo:

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

También es Ruta, así que sí ... ¡Simplemente elimínelo si no es necesario y listo! También debe seguir las respuestas proporcionadas anteriormente.

Desarrollo de DM
fuente
1
Hola Aline Matos, no hay problema. Me tomó como un día entero averiguar qué estaba mal ... Me alegro de que haya ayudado.
DM en desarrollo el
3
¿Y si fuera necesario?
Aziz
1
@Aziz simplemente muévalo a un controlador
Binar Web
0

compruebe que su archivo web.php tenga esta extensión

use Illuminate\Support\Facades\Route;

mi problema se solucionó de esta manera.

pankaj kumar
fuente