laravel Невозможно подготовить маршрут... для сериализации. Использование закрытия

Когда я очищаю кеши в своем проекте Laravel 5.2, я вижу это сообщение об ошибке:

[LogicException] Невозможно подготовить маршрут [панель] для сериализации. Использует закрытие.

Я думаю, что это связано с маршрутом

Route::get('/article/{slug}', '[email protected]');

связанный с определенным методом в моем контроллере:

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

Короче говоря, из главного представления я передаю $ slug, то есть ссылку на статью, с $ slug, которая уникальна в базе данных, я идентифицирую запись, а затем передаю ее содержимое в подробное представление.

У меня не было проблем, когда я писал метод, он работал, как шарм, но после того, как я очистил кеши, я получаю эту ошибку, а ссылки в главном представлении не показывают никакого короткого кода.

Где я поступаю неправильно?

Ответы

Ответ 1

Я думаю, что это связано с маршрутом

Route::get('/article/{slug}', '[email protected]');

связанный с определенным методом в моем контроллере:

Нет, это не так. Сообщение об ошибке поступает из команды route:cache, не уверен, почему очистка кеша вызывает это автоматически.

Проблема - это маршрут, который использует Closure вместо контроллера, который выглядит примерно так:

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

Поскольку Closures не могут быть сериализованы, вы не можете кэшировать свои маршруты, когда у вас есть маршруты, которые используют закрытие.

Ответ 2

Если ни один из ваших маршрутов не содержит замыкания, но вы все еще получаете эту ошибку, проверьте

routes/api.php

Laravel добавляет маршрут к файлу auth api по умолчанию в указанный выше файл (я думаю, что он делает это, когда мы вызываем php artisan make:auth)

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

который может быть прокомментирован или заменен вызовом метода контроллера при необходимости:

Ответ 3

Это определенно ошибка. Laravel предлагает предопределенный код в routs/api.php

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

который не может быть обработан:

php artisan route:cache

Это определенно должно быть исправлено командой Laravel. (проверьте ссылку link),

просто, если вы хотите это исправить, вы должны заменить код route\api.php чем-то вроде:

Route::middleware('auth:api')->get('/user', '[email protected]');

и в UserController поставь этот метод:

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

Ответ 4

Если кто-то все еще ищет ответ, для меня проблема была в файле route/web.php. Пример:

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

Это также маршрут, так что да... Просто удалите его, если не нужно, и вы готовы идти! Вы также должны следовать ответам, представленным выше.

Ответ 5

сольватация, когда мы используем такие маршруты:

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

laravel называет их Closure, так что вы не можете оптимизировать использование маршрутов, поскольку Closures вы должны направить на контроллер, чтобы использовать php artisan optimize