Laravel 拉威尔无法准备路线。。。用于序列化。使用闭包
当我清除Laravel 5.2项目中的缓存时,我看到以下错误消息: [逻辑例外] 无法为序列化准备路由[面板]。使用闭包 我认为这与路线有关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
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。