Laravel9升级至10及PHPUnit10后所有测试用例失败求助
Laravel 10 + PHPUnit 10 升级后测试全部失败:方法声明兼容问题
问题描述
近期将Laravel从9版本升级至10版本,同时把PHPUnit升级至10版本,升级完成后所有测试用例均执行失败,报错信息如下:
PHP Fatal error: Declaration of
Illuminate\Database\PDO\Concerns\ConnectsToDatabase::connect(array
$params, $username = null, $password = null, array $driverOptions =
[]) must be compatible with Doctrine\DBAL\Driver::connect(array
$params): Doctrine\DBAL\Driver\Connection in
/vendor/laravel/framework/src/Illuminate/Database/PDO/Concerns/ConnectsToDatabase.php
on line 22
降级回之前的版本后,所有测试用例均可正常运行,不确定新版本中是否存在废弃特性导致该问题。
项目composer.json配置
{ "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", "keywords": [ "framework", "laravel" ], "license": "MIT", "require": { "php": "^8.2", "ext-gnupg": "*", "awobaz/compoships": "^2.0", "doctrine/dbal": "^3.0", "elasticsearch/elasticsearch": "^7.16", "guzzlehttp/guzzle": "7.7", "kevinrob/guzzle-cache-middleware": "^4.1", "laminas/laminas-stdlib": "^3.3", "laravel/framework": "^10.0", "laravel/horizon": "^5.19", "laravel/sanctum": "^3.2", "laravel/tinker": "^2.8", "launchdarkly/server-sdk": "^5.1", "league/flysystem-aws-s3-v3": "^3.15", "league/flysystem-sftp-v3": "^3.15", "mnapoli/dbal-schema": "^1.3", "ratchet/pawl": "^0.4.1", "staudenmeir/eloquent-has-many-deep": "^1.18", "textalk/websocket": "^1.6" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.5", "fakerphp/faker": "^1.9.1", "laravel/pint": "0.1.5", "laravel/telescope": "^4.4", "mockery/mockery": "^1.3.1", "nunomaduro/collision": "^6.0", "phpunit/phpunit": "^10.0", "spatie/laravel-ignition": "^2.0", "orchestra/testbench-core":"^6.0" }, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true }, "extra": { "laravel": { "dont-discover": [ "laravel/telescope" ] } }, "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "minimum-stability": "dev", "prefer-stable": true, "scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "@php artisan key:generate --ansi" ] } }
解决方案分析
这个错误的核心是方法签名不兼容:Laravel的ConnectsToDatabase::connect方法声明和Doctrine DBAL的Driver::connect接口定义不一致。
问题根源
- Laravel 10要求Doctrine DBAL的版本至少是
^3.6,而你的composer.json中指定的是^3.0,这会导致安装的DBAL版本可能低于Laravel 10兼容的最低要求,进而出现方法签名不匹配的问题。 - 另外,
orchestra/testbench-core的版本^6.0是适配Laravel 8的,Laravel 10需要的是^8.0版本的testbench,这也可能引发依赖冲突,间接导致该错误。
修复步骤
- 更新Doctrine DBAL版本:将
doctrine/dbal的版本改为^3.6或更高,确保和Laravel 10兼容。 - 升级Orchestra Testbench:把
orchestra/testbench-core的版本更新为^8.0,匹配Laravel 10的要求。 - 执行依赖更新:运行命令:
或者直接执行composer update doctrine/dbal orchestra/testbench-corecomposer update同步所有依赖版本。 - 清除缓存:更新依赖后,清除Laravel缓存:
php artisan cache:clear php artisan config:clear
验证
完成上述步骤后,重新运行测试用例,即可解决方法声明兼容问题,测试应能正常执行。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

