目标类 [D​​atabaseSeeder] 不存在 - Laravel 7 和 Composer 2

Ben*_*LOT 1 composer-php laravel-7

我有一个 Laravel 7 的应用程序,我将 Composer 1.10 升级到 Composer 2.0,但遇到了这个问题:


   Illuminate\Contracts\Container\BindingResolutionException

  Target class [DatabaseSeeder] does not exist.

  at vendor/laravel/framework/src/Illuminate/Container/Container.php:807
    803|
    804|         try {
    805|             $reflector = new ReflectionClass($concrete);
    806|         } catch (ReflectionException $e) {
  > 807|             throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
    808|         }
    809|
    810|         // If the type is not instantiable, the developer is attempting to resolve
    811|         // an abstract type such as an Interface or Abstract Class and there is

      +37 vendor frames
  38  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

Run Code Online (Sandbox Code Playgroud)

我尝试了很多解决方案(即使是 Laravel 8 ...)但没有成功。

这是composer.json的自动加载

        "psr-4": {
            "App\\": "app/",
            "DatabaseSeeder\\": "database/seeds"
        },
        "files": [
            "app/helpers.php"
        ]
    }
Run Code Online (Sandbox Code Playgroud)

谢谢 !

编辑

这是我刚刚发现的:当我添加到composer.json中时:

  "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories",
            "Database\\Seeds\\": "database/seeds",
            "DatabaseSeeder\\": "database/seeds/",
} },
Run Code Online (Sandbox Code Playgroud)

我修改了 SeedCommand.php 'src/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php' 的第 84 行,它起作用了!

$class = $this->laravel->make($this->input->getOption('class'));
Run Code Online (Sandbox Code Playgroud)

经过

$class = $this->laravel->make('Database\\Seeds\\DatabaseSeeder');
Run Code Online (Sandbox Code Playgroud)

但这是绝对不可维护的...所以问题是,DatabaseSeeder设置的时候出现了问题。

6一个想法?

Ben*_*LOT 6

我找到了解决方案:Laravel 文档:https ://laravel.com/docs/7.x/seeding#introduction

所有种子类都存储在database/seeds 目录中...默认情况下,已为您定义了DatabaseSeeder 类。

该文件夹与 PSR-4 不兼容,因此您必须在 Laravel 7 中使用composer.json 中的类映射。

因此,还需要删除种子文件中的名称空间。

这是我的作曲家 json:

"autoload": {
        "psr-4": {
            "App\\": "app/",
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [
            "app/helpers.php"
        ]
    }
Run Code Online (Sandbox Code Playgroud)