【问题标题】:laravel Unable to prepare route ... for serialization. Uses Closurelaravel 无法为序列化准备路由...。使用闭包
【发布时间】:2017-12-29 04:38:23
【问题描述】:

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

我在编写该方法时没有遇到任何问题,实际上它就像一个魅力,但在我清理缓存后,我收到了该错误,并且主视图中的链接不显示任何短代码。

我哪里做错了?

【问题讨论】:

  • edit您的问题包括您的其余路线(尤其是面板路线)

标签: laravel serialization routes


【解决方案1】:

我认为它与路线有关

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

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

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

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

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

由于闭包不能被序列化,当你有使用闭包的路由时,你不能缓存你的路由。

【讨论】:

  • 所以命令 => php artisan route:cache 在 laravel 上不起作用?一个错误?
  • @robspin 我不认为这是一个错误,因为它在 Laravel 文档laravel.com/docs/5.7/deployment#optimization 中明确指出(查看优化路由加载部分)
  • 由于此功能使用 PHP 序列化,您只能缓存仅使用基于控制器的路由的应用程序的路由。 PHP 无法序列化闭包。所以不要使用 php artisan route:cache 是正确的方法!只需使用 php artisan 缓存:clear
  • 那么,有什么解决办法吗?
  • 请参阅下面的 IBRAHIM EZZAT 解决方案。基本上需要用路由文件中的控制器方法替换任何闭包
【解决方案2】:

如果您的路线都没有包含闭包,但您仍然收到此错误,请检查

路由/api.php

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

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

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

【讨论】:

  • 这是正确的答案,当我注释掉Route/api.php Route 函数时,这个错误就消失了。谢谢 Manpreet。
【解决方案3】:

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

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

无法处理的:

php artisan route:cache

这绝对应该由 Laravel 团队解决。(查看link),

如果你想修复它,你应该用类似的东西替换 routes\api.php 代码:

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

在 UserController 中放入这个方法:

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

【讨论】:

  • 确实像一个错误。如果他们可以在路由中使用闭包,那么他们应该修复工匠命令,以便他们至少不会给出任何错误。
  • 这是相关的 PR,已关闭 :( github.com/laravel/laravel/pull/4601
【解决方案4】:

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

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

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

【讨论】:

  • 嗨,艾琳·马托斯,没问题。我花了一整天的时间才弄清楚出了什么问题……很高兴它有帮助。
  • 如果需要怎么办?
  • @Aziz 把它移到控制器中
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

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

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

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

    和路由/api.php

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

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

    【讨论】:

      【解决方案7】:

      这个问题的实际解决方案是改变web.php中的第一行

      只需将欢迎路线替换为以下路线

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

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

      【讨论】:

        【解决方案8】:

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

        use Illuminate\Support\Facades\Route;
        

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

        【讨论】:

          【解决方案9】:

          为了解决这个问题(至少在 laravel 6 中): Route.php 中的 action 属性包含所有需要的信息。 laravel 应该可以提供更好的错误消息。

          我所做的是在抛出异常之前添加一个 dd($this->action) : https://github.com/laravel/framework/blob/6.x/src/Illuminate/Routing/Route.php#L917

          有了它,我可以很容易地确定位置,在我的例子中是 api.php 和第 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" => []
          ]
          

          【讨论】:

            【解决方案10】:

            如果您因为已将 Laravel =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"
                ],
            

            【讨论】:

            • 这解决了我的问题
            猜你喜欢
            • 2020-03-13
            • 2019-11-11
            • 2020-08-27
            • 2019-05-21
            • 2020-06-19
            • 2021-08-24
            • 2018-12-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多