迁移到 Laravel 5,route:cache 抛出异常

Migrating to Laravel 5, route:cache throwing exception

从 Laravel 4.2 升级到 5.0

我们的 API 中有大约 200 条路线,其中大部分是闭包。所以我花了最近几天的大部分时间将它们全部转换为控制器路由。一切都恢复稳定,但是当我尝试 运行 php artisan route:cache 它抛出异常

[Exception]
Serialization of 'Closure' is not allowed

我为 function 按了 ctrl+f,路由文件中只剩下两个 Route::group 条目(是的,它们是闭包...但肯定只有路由数...)。

有什么指导吗?折腾了这两天,这个错误……不是我想看到的

编辑:完整堆栈跟踪

路由缓存已清除!

  [Exception]                                
  Serialization of 'Closure' is not allowed  



Exception trace:
 () at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteCacheCommand.php:95
 serialize() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteCacheCommand.php:95
 Illuminate\Foundation\Console\RouteCacheCommand->buildRouteCacheFile() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteCacheCommand.php:65
 Illuminate\Foundation\Console\RouteCacheCommand->fire() at n/a:n/a
 call_user_func_array() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Container\Container.php:523
 Illuminate\Container\Container->call() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Console\Command.php:115
 Illuminate\Console\Command->execute() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\symfony\console\Symfony\Component\Console\Command\Command.php:257
 Symfony\Component\Console\Command\Command->run() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Console\Command.php:101
 Illuminate\Console\Command->run() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\symfony\console\Symfony\Component\Console\Application.php:874
 Symfony\Component\Console\Application->doRunCommand() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\symfony\console\Symfony\Component\Console\Application.php:195
 Symfony\Component\Console\Application->doRun() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\symfony\console\Symfony\Component\Console\Application.php:126
 Symfony\Component\Console\Application->run() at C:\Users\cjtho_000\Desktop\ecapi_l5\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php:94
 Illuminate\Foundation\Console\Kernel->handle() at C:\Users\cjtho_000\Desktop\ecapi_l5\artisan:36

编辑 2:删除了要测试的路由组,仍然抛出异常

根据您的堆栈跟踪,

vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteCacheCommand.php:95
serialize() at vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteCacheCommand.php:95

Laravel 正在尝试序列化路由集合 on line 95 of RouteCacheCommand.php

您遇到的错误

Serialization of 'Closure' is not allowed

看起来像其 PHP 的标准 "someone tried to serialize an anonymous function" 异常消息(相对于它可能是自定义 Laravel 异常)。

这意味着 某事 正在向您的路由集合添加匿名函数(即 "closure")。如果您 100% 确定已将它们全部从 routes.php 中删除,我猜该路由在某处的第三方代码中。

最好不要猜。尝试一些类似下面的调试代码

//un-tested pseudo debugging code

//get the application's routes, using the same 
//technique as the route:cache command
$app = require /path/to/your/laravel/bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
$routes = $app['router']->getRoutes();

//go through each route
foreach($routes as $route)
{
    //if the route is a closure
    if(is_object($route) && ($route instanceof Closure))
    {
        //use reflection to find out which file the closure is defined in
        $r = new ReflectionFunction($route);
        var_dump($route->getFileName ());
    }

}

这将使您找出导致问题的闭包的定义位置,这应该足以指出问题所在。

事实证明,完全无用的错误消息试图告诉我我有一个 重复的路由 (复制粘贴错误,我有两个匹配相同 uri 的获取路由)。

删除重复项解决了问题。