Laravel 5.5 Passport构建API时遇ClientRepositoryInterface实例化错误求助
我之前在整合Passport和第三方OAuth扩展时也碰到过一模一样的错误,这个问题的核心是Laravel的服务容器找不到League\OAuth2\Server\Repositories\ClientRepositoryInterface对应的具体实现类,大概率是Passport的初始化流程没走全,或者第三方扩展和Passport的依赖绑定冲突了。下面是我亲测有效的解决步骤:
1. 确认Passport服务提供者已正确注册
Laravel 5.5虽然支持包自动发现,但偶尔会出现识别异常,手动检查一下:
- 打开
config/app.php,查看providers数组里是否包含Laravel\Passport\PassportServiceProvider::class - 如果没有的话手动添加进去,然后运行
php artisan config:clear清除配置缓存,让新的服务提供者生效
2. 重新执行Passport的初始化命令
Passport的passport:install命令不仅会生成加密密钥,还会自动在服务容器中注册所有必要的仓库接口绑定,有时候之前的执行可能不完整:
php artisan passport:install
同时别忘了确保Passport的数据库表已经创建,执行:
php artisan migrate
3. 排查第三方Facebook扩展的冲突
你使用的Facebook授权扩展可能也在操作OAuth2 Server的组件,覆盖了Passport的绑定:
- 找到该扩展的服务提供者文件,查看是否有绑定
ClientRepositoryInterface的代码 - 如果有的话,在
config/app.php里把Passport的服务提供者放在这个Facebook扩展的前面,让Passport的绑定先被注册
4. 手动绑定接口到Passport的实现类
如果上面的步骤都没解决问题,可以在app/Providers/AppServiceProvider.php的register方法里手动添加绑定:
public function register() { $this->app->bind( \League\OAuth2\Server\Repositories\ClientRepositoryInterface::class, \Laravel\Passport\Bridge\ClientRepository::class ); }
如果还有其他类似的接口无法实例化错误,比如AccessTokenRepositoryInterface,也可以用同样的方式绑定Passport对应的实现类。
5. 清除所有缓存
缓存有时候会导致旧的绑定没有被更新,执行以下命令清空所有缓存:
php artisan cache:clear php artisan route:clear php artisan config:clear
额外提醒:请确认你安装的Passport版本和Laravel 5.5兼容,Passport 6.x及以上版本需要Laravel 5.6+,所以Laravel 5.5应该安装Passport 4.x或5.x版本,版本不兼容也会引发这类依赖注入问题。
内容的提问来源于stack exchange,提问作者Mark

