如何修复Laravel中SocialiteProviders刷新令牌声明不兼容错误
问题场景
升级到Laravel 10后执行composer up,依赖配置如下:
"require": { "php": "^8.2", ... "laravel/socialite": "^5", ... "socialiteproviders/apple": "^5" },
触发以下致命错误:
PHP Fatal error: Declaration of SocialiteProviders\Apple\Provider::refreshToken(string $refreshToken): Psr\Http\Message\ResponseInterface must be compatible with Laravel\Socialite\Two\AbstractProvider::refreshToken($refreshToken) in /Users/user/Sites/site/vendor/socialiteproviders/apple/Provider.php on line 289
已安装两者最新版本,无自定义代码。
解决方案
这个错误源于socialiteproviders/apple v5版本的方法签名与Laravel Socialite v5的抽象方法不兼容(PHP 8.2对方法签名兼容性检查更严格),可按以下步骤修复:
升级
socialiteproviders/apple到适配版本
Laravel 10对应的兼容版本为^6.0,该版本已调整方法签名匹配Socialite要求。修改composer.json中的依赖:"socialiteproviders/apple": "^6.0"执行更新命令:
composer update socialiteproviders/apple确保Laravel Socialite版本适配
Laravel 10要求laravel/socialite至少为^5.10,若当前版本较低,可一并更新:composer update laravel/socialite清除框架缓存
更新依赖后清除缓存,确保修改生效:php artisan cache:clear php artisan config:clear
原理说明
Laravel Socialite v5后续版本调整了refreshToken方法的签名,而socialiteproviders/apple v5版本仍保留旧的强类型声明,在PHP 8.2的严格模式下触发兼容性错误。升级到socialiteproviders/apple v6版本后,方法签名将与Socialite的抽象方法保持一致,解决该问题。
内容的提问来源于stack exchange,提问作者daprezjer

