laravel无法准备路线…以进行序列化。使用闭包


81

当我在Laravel 5.2项目中清除缓存时,看到以下错误消息:

[LogicException]无法准备要进行序列化的路由[panel]。使用闭包。

我认为这与路线有关

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,我确定了记录,然后将其内容传递给了详细视图。

编写该方法时,我没有任何问题,但实际上它就像一个咒语一样工作,但是清除缓存后,出现该错误,并且主视图中的链接不显示任何短代码。

我在哪里做错了?


修改您的问题,以包括其余路线(尤其是小组路线)
Chris Forrence

Answers:


130

我认为这与路线有关

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

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

不,不是这样。错误消息来自route:cache命令,不确定为什么清除缓存会自动调用此命令。

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

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

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


3
所以命令=> php artisan route:cache在laravel上不起作用?一个错误?
robspin

3
@robspin我不认为这是一个错误,因为它在Laravel文档中明确指出了laravel.com/docs/5.7/deployment#optimization(请参见“优化路线加载”部分)
Anatoliy Arkhipov,

4
由于此功能使用PHP序列化,因此只能为仅使用基于控制器的路由的应用程序缓存路由。PHP无法序列化Closures。因此,不要使用php artisan route:cache是​​正确的方法!只需使用php artisan cache:clear
robspin

1
那么,有什么解决方案吗?
zukijuki

请参阅下面的IBRAHIM EZZAT解决方案。根本需要用路由文件中的控制器方法替换任何闭包
Alistair R

51

如果您的路线均未包含闭包,但仍然出现此错误,请检查

路线/api.php

Laravel在上述文件中具有默认的auth api路由。

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

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


34

这绝对是一个错误.Laravel在route / api.php中提供了预定义的代码

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

无法通过以下方式处理:

php artisan route:cache

这肯定应该由Laravel小组解决。(请检查链接),

简单来说,如果您要修复它,则应使用类似以下内容的方法替换route \ api.php代码:

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

并在UserController中放置以下方法:

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

1
似乎确实是一个错误。如果它们使在路由中使用闭包成为可能,则应修复artisan命令,以便至少不给出任何错误。
Arno van Oordt

这是相关的PR,已经关闭了:( github.com/laravel/laravel/pull/4601
William Turrell

6

检查您的routes / web.phproutes / api.php

Laravel在route / web.php中带有默认的路由关闭:

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

和路线/api.php

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

如果将其删除,请再试一次以清除路由缓存。



4

使用以下路线时的解决方案:

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

laravel称它们为闭包,因此您不能优化路由使用,因为必须将闭包路由到控制器才能使用 php artisan optimize


2

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

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

它也是Route,所以是的...只要不需要就将其删除,您就可以开始了!您还应该遵循上面提供的答案。


1
嗨Aline Matos,没问题。我花了整整一天的时间才弄清楚哪里出了问题...很高兴。
DM开发

3
如果需要怎么办?
阿齐兹

1
@Aziz只是将其移动到控制器中
Binar Web

0

检查您的web.php文件是否具有此扩展名

use Illuminate\Support\Facades\Route;

我的问题就这样解决了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.