无法为序列化准备路线。使用闭合

当我清除 Laravel 5.2项目中的缓存时,我看到这个错误消息:

[逻辑例外] 无法为序列化准备路由[面板]。使用闭包。

我觉得这和一条路线有关

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

与我的控制器中的一个特定方法相关联:

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,这在数据库中是唯一的,我识别记录,然后将其内容传递给详细视图。

当我编写这个方法的时候,我没有遇到任何问题,事实上它非常有效,但是在我清理了缓存之后,我得到了这个错误,并且主视图中的链接没有显示任何短代码。

我哪里做错了?

187073 次浏览

I think that it's related with a route

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

associated with a particular method in my controller:

No, thats not it. The error message is coming from the route:cache command, not sure why clearing the cache calls this automatically.

The problem is a route which uses a Closure instead of a controller, which looks something like this:

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

Since Closures can not be serialized, you can not cache your routes when you have routes which use closures.

If none of your routes contain closures, but you are still getting this error, please check

routes/api.php

Laravel has a default auth api route in the above file.

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

which can be commented or replaced with a call to controller method if required.

This is definitely a bug.Laravel offers predefined code in routes/api.php

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

which is unabled to be processed by:

php artisan route:cache

This definitely should be fixed by Laravel team.(check the link),

simply if you want to fix it you should replace routes\api.php code with some thing like :

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

and in UserController put this method:

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

If someone is still looking for an answer, for me the problem was in routes/web.php file. Example:

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

It is also Route, so yeah...Just remove it if not needed and you are good to go! You should also follow answers provided from above.

the solustion when we use routes like this:

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

laravel call them Closure so you cant optimize routes uses as Closures you must route to controller to use php artisan optimize

Check your routes/web.php and routes/api.php

Laravel comes with default route closure in routes/web.php:

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

and routes/api.php

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

if you remove that then try again to clear route cache.

The Actual solution of this problem is changing first line in web.php

Just replace Welcome route with following route

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

If still getting same error than you probab

check that your web.php file has this extension

use Illuminate\Support\Facades\Route;

my problem gone fixed by this way.

In order to troubleshoot this (at least in laravel 6): The action property inside Route.php has all the info needed. A better error message should be possible to provide by laravel.

What I did was to add a dd($this->action) just before the exception is thrown here: https://github.com/laravel/framework/blob/6.x/src/Illuminate/Routing/Route.php#L917

With that in place I could easily pinpoint the location, in my case api.php and lines 22-24:

array:6 [
"middleware" => "api"
"domain" => "local-api.mydomain.com"
"uses" => Closure()^ {#6497
class: "App\Providers\RouteServiceProvider"
this: App\Providers\RouteServiceProvider {#5743 …}
file: "./routes/api.php"
line: "22 to 24"
}
"namespace" => "App\Http\Controllers"
"prefix" => null
"where" => []
]

If you're coming to this problem because you've upgraded Laravel <5.8 project up to >=5.8, you've likely used the ./vendor/bin/carbon-upgrade method to upgrade the project as suggested by your terminal. In this case, you simply need to remove the following two blocks from the bottom of your composer.json file and composer install again:

    "post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"php artisan optimize"
],
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"php artisan optimize"
],

This is how I solved mine.

  1. Navigate to routes directory

  2. Then open api.php

  3. comment code that looks like this: Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); });

  4. Then run php artisan optimize