You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,这也可能引发依赖冲突,间接导致该错误。

修复步骤

  1. 更新Doctrine DBAL版本:将doctrine/dbal的版本改为^3.6或更高,确保和Laravel 10兼容。
  2. 升级Orchestra Testbench:把orchestra/testbench-core的版本更新为^8.0,匹配Laravel 10的要求。
  3. 执行依赖更新:运行命令:
    composer update doctrine/dbal orchestra/testbench-core
    
    或者直接执行composer update同步所有依赖版本。
  4. 清除缓存:更新依赖后,清除Laravel缓存:
    php artisan cache:clear
    php artisan config:clear
    

验证

完成上述步骤后,重新运行测试用例,即可解决方法声明兼容问题,测试应能正常执行。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:58