PHP7.3升级至8.1后zerospam/laravel-gettext无法运行求助
PHP 7.3升级到8.1后zerospam/laravel-gettext组件报错解决
问题概述
将PHP版本从7.3升级到8.1后,项目依赖的zerospam/laravel-gettext(^8.0)组件无法正常运行,出现方法声明不兼容及类未找到的致命错误。
报错信息
[Wed Oct 5 10:07:23 2022] PHP致命错误:Xinax\LaravelGettext\FileLoader\Cache\ApcuFileCacheLoader::loadResource($resource)的声明必须与Symfony\Component\Translation\Loader\FileLoader::loadResource(string $resource): array兼容,文件路径为C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\FileLoader\Cache\ApcuFileCacheLoader.php第40行 [Wed Oct 5 10:07:23 2022] PHP致命错误:未捕获错误:类“Xinax\LaravelGettext\FileLoader\Cache\ApcuFileCacheLoader”未找到,文件路径为C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Translators\Symfony.php第114行 堆栈跟踪: #0 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Translators\Symfony.php(63): Xinax\LaravelGettext\Translators\Symfony->createTranslator()<br /> #1 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Translators\Symfony.php(77): Xinax\LaravelGettext\Translators\Symfony->getTranslator()<br /> #2 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Translators\Symfony.php(35): Xinax\LaravelGettext\Translators\Symfony->setLocale('en_CA')<br /> #3 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\LaravelGettextServiceProvider.php(68): Xinax\LaravelGettext\Translators\Symfony->__construct(Object(Xinax\LaravelGettext\Config\Models\Config), Object(Xinax\LaravelGettext\Adapters\LaravelAdapter), Object(Xinax\LaravelGettext\FileSystem), Object(Xinax\LaravelGettext\Storages\SessionStorage))<br /> #4 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php(873): Xinax\LaravelGettext\LaravelGettextServiceProvider->Xinax\LaravelGettext{closure}(Object(Illuminate\Foundation\Application), Array) #5 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php(758): Illuminate\Container\Container->build(Object(Closure)) #6 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(851): Illuminate\Container\Container->resolve('Xinax\LaravelGe...', Array, true)#7 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php(694): Illuminate\Foundation\Application->resolve('Xinax\LaravelGe...', Array)<br /> #8 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(836): Illuminate\Container\Container->make('Xinax\LaravelGe...', Array) #9 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php(119): Illuminate\Foundation\Application->make('Xinax\LaravelGe...', Array) #10 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Support\helpers.php(18): app('Xinax\LaravelGe...') #11 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\app\Exceptions\Handler.php(152): _i('Details') #12 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(196): App\Exceptions\Handler->render(Object(Illuminate\Http\Request), Object(Symfony\Component\ErrorHandler\Error\FatalError)) #13 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(173): Illuminate\Foundation\Bootstrap\HandleExceptions->renderHttpResponse(Object(Symfony\Component\ErrorHandler\Error\FatalError)) #14 C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(209): Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(Object(Symfony\Component\ErrorHandler\Error\FatalError)) #15 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleShutdown() #16 {main} 抛出位置:C:\Users\pragneshc\promis\Promis3.0\promis3.0-laravel\vendor\zerospam\laravel-gettext\src\Xinax\LaravelGettext\Translators\Symfony.php第114行
项目composer.json依赖片段
"require": { "php": "^8.1", "artisaninweb/laravel-soap": "0.3.0.9", "barryvdh/laravel-dompdf": "^0.8.5", "fideloper/proxy": "^4.0", "laravel/framework": "^8.0", "laravel/homestead": "^13.2", "laravel/tinker": "^2.0", "maatwebsite/excel": "^3.1", "phpoffice/phpspreadsheet": "^1.10", "zerospam/laravel-gettext": "^8.0" }, "require-dev": { "facade/ignition": "^2.3.6", "fzaninotto/faker": "^1.4", "mockery/mockery": "^1.0", "nunomaduro/collision": "^5.1", "phpunit/phpunit": "^9.0" }
解决方案
1. 升级组件到兼容PHP8.1的版本
zerospam/laravel-gettext 8.x版本未适配PHP8.1的严格类型声明要求,建议升级到支持PHP8.1的最新稳定版本(如9.x系列),执行以下命令:
composer require zerospam/laravel-gettext:^9.0 --update-with-dependencies
升级后需验证组件功能是否正常,避免出现其他兼容问题。
2. 临时修改方法声明(应急方案)
若暂时无法升级组件,可手动修改ApcuFileCacheLoader.php中的方法声明,使其与父类Symfony\Component\Translation\Loader\FileLoader的loadResource方法兼容:
打开文件vendor/zerospam/laravel-gettext/src/Xinax/LaravelGettext/FileLoader/Cache/ApcuFileCacheLoader.php,找到第40行,将:
public function loadResource($resource)
修改为:
public function loadResource(string $resource): array
注意:此修改会在composer update时被覆盖,仅作为临时应急手段,长期使用需依赖组件官方更新。
3. 同步Symfony组件版本
Laravel 8.x对应的Symfony组件可能存在PHP8.1兼容问题,执行以下命令更新Symfony Translation组件至兼容版本:
composer update symfony/translation --with-dependencies
内容的提问来源于stack exchange,提问作者Pragnesh Chauhan
相关产品推荐
相关产品推荐

