迁移到 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 的获取路由)。
删除重复项解决了问题。
从 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 的获取路由)。
删除重复项解决了问题。