Laravel 拉威尔无法准备路线。。。用于序列化。使用闭包

Laravel 拉威尔无法准备路线。。。用于序列化。使用闭包,laravel,serialization,routes,Laravel,Serialization,Routes,当我清除Laravel 5.2项目中的缓存时,我看到以下错误消息: [逻辑例外] 无法为序列化准备路由[面板]。使用闭包 我认为这与路线有关 Route::get('/article/{slug}', 'Front@slug'); 与我的控制器中的特定方法关联: public function slug($slug) { $article = Article::where('slug',$slug)->first(); $id = $article ->id_ar

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

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

我哪里做错了

我认为这与路线有关

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)); 
}`
不,不是这样。错误消息来自
route:cache
命令,不确定为什么清除缓存会自动调用此命令

问题是使用闭包而不是控制器的路由,其外观如下所示:

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

由于闭包无法序列化,因此当您有使用闭包的路由时,您无法缓存路由。

如果没有任何路由包含闭包,但您仍然收到此错误,请检查

routes/api.php

Route::middleware('auth:api')->get('/user', function (Request $request) { 
     return $request->user(); 
});
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Laravel在上面的文件中有一个默认的auth api路由

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

如果需要,可以对其进行注释或替换为调用控制器方法。

这肯定是一个bug。Laravel在routes/api.php中提供了预定义的代码

Route::middleware('auth:api')->get('/user', function (Request $request) { 
     return $request->user(); 
});
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
不允许由以下人员处理:

php artisan route:cache
这肯定应该由Laravel团队解决。(检查

简单地说,如果您想修复它,您应该用如下内容替换routes\api.php代码:

Route::middleware('auth:api')->get('/user', 'UserController@AuthRouteAPI');
在UserController中,使用以下方法:

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

如果有人仍在寻找答案,对我来说,问题出在routes/web.php文件中。例如:

Route::get('/', function () {
    return view('welcome');
});
这也是一条路线,所以是的……如果不需要,只要把它移走,你就可以走了!
您还应遵循上面提供的答案。

当我们使用以下路线时,请注意:

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

laravel将其称为闭包,因此您无法优化路由使用作为闭包您必须路由到控制器才能使用
php artisan optimize

检查您的路由/web.php路由/api.php

Laravel在routes/web.php中提供了默认的路由关闭:

Route::get('/', function () {
    return view('welcome');
});
和routes/api.php

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

如果删除该选项,请再次尝试清除路由缓存。

此问题的实际解决方案是更改web.php中的第一行

用下面的路线代替欢迎路线

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

如果仍然收到与您可能遇到的相同错误,请检查您的web.php文件是否具有此扩展名

use Illuminate\Support\Facades\Route;

我的问题通过这种方式得到了解决。

请将您的问题包括在剩下的路由(特别是面板路由)中,这样命令=>php artisan route:cache在laravel上不起作用?bug?@robspin我不认为这是bug,因为它在Laravel文档(检查优化路由加载一节)中有明确的说明。由于此功能使用PHP序列化,您可能只能为专门使用基于控制器的路由的应用程序缓存路由。PHP无法序列化闭包。所以不要使用php artisan路由:缓存是正确的方法!只需使用php artisan缓存:clearso,任何解决方案?请参阅下面的易卜拉欣·埃扎特解决方案。基本上需要在路由文件中用控制器方法替换任何闭包,这没有问题。我花了整整一天的时间才弄清楚到底出了什么问题……很高兴它起到了作用。如果它需要怎么办?@Aziz只要把它移到一个控制器里,看起来就像一只虫子。如果他们能够在路由中使用闭包,那么他们应该修复artisan命令,这样他们至少不会给出任何错误。这是相关的PR,它已经关闭:(这对我来说很有用!TKST这是正确的答案,当我在Route/api.php路由函数中注释它时,这个错误就消失了。谢谢Manpreet。