You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel 7执行php artisan route:cache命令报错:api/user路由无法序列化(存在闭包)

解决Laravel 7路由缓存报错:Unable to prepare route [api/user] for serialization. Uses Closure.

嘿,这个问题我太熟了!你看到的错误提示明确指向api/user路由,但你只检查了web.php——问题其实出在**routes/api.php文件**里,默认的Laravel 7安装中,这个文件自带了一个用闭包定义的路由,而Laravel的路由缓存功能完全不支持闭包路由的序列化,这就是报错的根源。

第一步:定位问题代码

打开你的routes/api.php文件,你大概率会看到这段默认生成的代码:

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

这段代码里的匿名函数(闭包)就是导致route:cache命令失败的原因。

第二步:解决方法(二选一)

方法1:直接删除不需要的闭包路由

如果你的项目不需要这个api/user接口,直接把这段代码删掉即可。之后执行:

php artisan route:clear
php artisan route:cache

应该就能成功完成路由缓存了。

方法2:将闭包转换为控制器方法

如果需要保留这个接口的功能,那就把闭包路由改成控制器方法的形式:

  1. 先创建一个API专用的用户控制器:
php artisan make:controller Api/UserController
  1. 在生成的app/Http/Controllers/Api/UserController.php中添加user方法:
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function user(Request $request)
    {
        return $request->user();
    }
}
  1. 修改routes/api.php里的路由,替换原来的闭包:
Route::middleware('auth:api')->get('/user', 'Api\UserController@user');

额外检查项

为了确保后续路由缓存不会再出问题,建议你再检查这些地方:

  • 有没有其他路由文件(比如自定义的路由文件)里存在闭包路由
  • 有没有在服务提供者(如RouteServiceProvider)里注册闭包路由
  • 执行缓存前先清理旧路由缓存:php artisan route:clear

完成以上操作后,重新运行php artisan route:cache,应该就能顺利完成路由缓存优化了。

内容的提问来源于stack exchange,提问作者Mahmoud Khosravi

火山引擎 最新活动