laravel无法准备路线......用于序列化.使用闭包

Fra*_*sco 43 serialization routes laravel

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

[LogicException]无法为序列化准备路由[面板].使用闭包.

我认为这与路线有关

Route::get('/article/{slug}', 'Front@slug');
Run Code Online (Sandbox Code Playgroud)

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

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)); 
}`
Run Code Online (Sandbox Code Playgroud)

简而言之,从主视图中我传递$ slug,这是文章的短链接,使用$ slug,这在数据库中是唯一的,我识别记录然后将其内容传递给详细视图.

我写这个方法时没有任何问题,事实上它就像一个魅力,但在我清理缓存后,我得到了这个错误,主视图中的链接没有显示任何短代码.

我哪里做错了?

tka*_*usl 61

我认为这与路线有关

Route::get('/article/{slug}', 'Front@slug');
Run Code Online (Sandbox Code Playgroud)

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

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

问题是使用Closure而不是控制器的路由,它看起来像这样:

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

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

  • 所以命令=> php artisan route:缓存不能在laravel上工作?一个bug? (3认同)
  • @robspin 我不认为这是一个错误,因为它在 Laravel 文档 https://laravel.com/docs/5.7/deployment#optimization 中有明确说明(检查优化路由加载部分) (3认同)
  • 由于此功能使用PHP序列化,因此只能为仅使用基于控制器的路由的应用程序缓存路由。PHP无法序列化Closures。因此,不要使用php artisan route:cache是​​正确的方法!只需使用php artisan cache:clear (3认同)
  • 那么,有什么解决办法吗? (2认同)

Man*_*eet 29

如果您的路由都没有包含闭包,但仍然出现此错误,请检查

路线/ api.php

Laravel为上面的文件添加了一个默认的auth api路由(我认为它在我们调用时会这样做php artisan make:auth)

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

如果需要,可以通过调用控制器方法进行注释或替换:


小智 10

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

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

无法通过以下方式处理:

php artisan route:cache
Run Code Online (Sandbox Code Playgroud)

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

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

Route::middleware('auth:api')->get('/user', 'UserController@AuthRouteAPI');
Run Code Online (Sandbox Code Playgroud)

并在UserController中放置以下方法:

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }
Run Code Online (Sandbox Code Playgroud)

  • 看起来确实是一个错误。如果他们使得在路由中使用闭包成为可能,那么他们应该修复 artisan 命令,以便他们至少不会给出任何错误。 (2认同)

Akr*_*han 9

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

只需用以下路线替换欢迎路线

Route::view('/', 'welcome');
Run Code Online (Sandbox Code Playgroud)

如果仍然遇到与您相同的错误


Paw*_*rma 7

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

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

Route::get('/', function () {
    return view('welcome');
});
Run Code Online (Sandbox Code Playgroud)

和路由/api.php

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

如果您删除它,请再次尝试清除路由缓存。


Luc*_*one 7

如果您遇到此问题是因为您已将 Laravel <5.8 项目升级到 >=5.8,则您可能已使用 ./vendor/bin/carbon-upgrade 方法按照终端的建议升级项目。在这种情况下,您只需从composer.json文件底部删除以下两个块,然后再次安装composer:

    "post-install-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postInstall",
        "php artisan optimize"
    ],
    "post-update-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postUpdate",
        "php artisan optimize"
    ],
Run Code Online (Sandbox Code Playgroud)


DM *_*ing 5

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

Route::get('/', function () {
    return view('welcome');
});
Run Code Online (Sandbox Code Playgroud)

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

  • 如果需要怎么办? (4认同)

小智 5

当我们使用这样的路由时的解决方案:

Route::get('/', function () {
    return view('welcome');
});
Run Code Online (Sandbox Code Playgroud)

laravel 称它们为 Closure,因此您无法优化路由使用作为 Closures 您必须路由到控制器才能使用 php artisan optimize