Laravel 9 + Passport v11.8覆盖路由报错,请求技术帮助
问题解决:Laravel 9 + Passport 自定义路由控制器不存在错误
不需要手动创建App\Http\Controllers\Laravel\Passport\Http\Controllers路径下的ClientController类,Passport的控制器已经存在于vendor包中,错误是路由命名空间的配置问题导致的。
错误原因
Laravel 9及之后的版本,路由默认采用完全限定类名方式解析控制器,不再自动拼接App\Http\Controllers前缀。你当前的路由组配置里设置了'namespace' => 'Laravel\Passport\Http\Controllers',Laravel会错误地把这个命名空间和默认的控制器命名空间拼接,最终寻找的路径变成了App\Http\Controllers\Laravel\Passport\Http\Controllers\ClientController,这显然不是Passport控制器的真实位置。
解决方案
有两种简单的修复方式:
方式一:使用完整控制器类名(推荐)
直接在路由里指定Passport控制器的完整类名,去掉路由组的namespace参数:
Route::group([ 'as' => 'passport.', 'prefix' => config('passport.path', 'oauth'), ], function () { Route::get('/clients', [ Laravel\Passport\Http\Controllers\ClientController::class, 'forUser', 'as' => 'clients.index', ]); // 其他Passport路由均按此格式修改,使用完整类名指定控制器 });
方式二:清空路由组的命名空间
如果想保留原有的路由组结构,将路由组的namespace设为空字符串或null,避免Laravel自动拼接默认命名空间:
Route::group([ 'as' => 'passport.', 'prefix' => config('passport.path', 'oauth'), 'namespace' => '', // 或者设置为null ], function () { Route::get('/clients', [ 'uses' => 'Laravel\Passport\Http\Controllers\ClientController@forUser', 'as' => 'clients.index', ]); // 其他Passport路由保持原有格式即可 });
补充说明
Passport的所有控制器都存放在vendor/laravel/passport/src/Http/Controllers目录下,无需手动复制或创建到自己的项目控制器目录中,只要通过正确的命名空间引用即可。
内容的提问来源于stack exchange,提问作者adam78
相关产品推荐
相关产品推荐

