返回

Laravel 升级至 PHP 8.1 后出现 `BindingResolutionException`,如何解决?

php

Laravel 升级到 PHP 8.1 后解决 BindingResolutionException

问题

升级 Laravel 8.75 到 PHP 8.1 后,可能会遇到以下错误:

Illuminate\Contracts\Container\BindingResolutionException - Target class [CommandMakeCommand] does not exist

原因

此错误表明 Laravel 无法找到 CommandMakeCommand 类,这是由于 PHP 8.1 中的命名空间更改。

解决方案

更新 composer.json

确保 composer.json 包含以下依赖项:

"symfony/console": "^5.4",

更新 Laravel 的自动加载器

运行以下命令:

composer dump-autoload

清除缓存

运行以下命令:

php artisan cache:clear

重启 PHP 服务器

如果项目使用 PHP 服务器,请将其重启。

更新 Laravel 的命名空间

config/app.php 中,将 Illuminate\Console\Command 命名空间更新为 Symfony\Component\Console\Command

'providers' => [
    // ...
    Illuminate\Console\CommandsServiceProvider::class,
],

'aliases' => [
    // ...
    'Command' => Symfony\Component\Console\Command\Command::class,
],

更新命名空间(可选)

在 Laravel 项目的 app/Console/Commands 目录中,将所有命令类的命名空间更新为 Symfony\Component\Console\Command

namespace Symfony\Component\Console\Command;

class CommandMakeCommand extends Command
{
    // ...
}

运行迁移(可选)

如果项目包含迁移,请运行以下命令:

php artisan migrate

其他建议

  • 使用与 PHP 8.1 兼容的 Laravel 版本。
  • 在进行重大升级之前备份项目。
  • 如果问题仍然存在,请查看 Laravel 发行说明或社区论坛以获取帮助。

常见问题解答

1. 如何确定 Laravel 版本是否与 PHP 8.1 兼容?

检查 Laravel 发行说明或查看 composer.json 中的最低 PHP 版本要求。

2. composer dump-autoload 命令有什么作用?

该命令重新生成自动加载器文件,其中包含所有注册的类和文件路径的映射。

3. 为什么需要更新命名空间?

PHP 8.1 引入了对命名空间的新处理,这需要更新 Laravel 中的命名空间。

4. 更新命令类的命名空间是必需的吗?

建议更新所有命令类的命名空间,但对于自定义命令可能不是必需的。

5. 为什么在升级后需要运行迁移?

一些升级可能会引入数据库模式更改,需要运行迁移来应用这些更改。