【问题标题】:Target class [DatabaseSeeder] does not exist - Laravel 7 and Composer 2目标类 [D​​atabaseSeeder] 不存在 - Laravel 7 和 Composer 2
【发布时间】:2021-03-12 13:30:14
【问题描述】:

我有一个带有 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))

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

这是 composer.json 的自动加载

        "psr-4": {
            "App\\": "app/",
            "DatabaseSeeder\\": "database/seeds"
        },
        "files": [
            "app/helpers.php"
        ]
    }

谢谢!

编辑

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

  "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories",
            "Database\\Seeds\\": "database/seeds",
            "DatabaseSeeder\\": "database/seeds/",
} },

并且我修改了 SeedCommand.php 'src/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php' 的第 84 行,它可以工作!!!

$class = $this->laravel->make($this->input->getOption('class'));

通过

$class = $this->laravel->make('Database\\Seeds\\DatabaseSeeder');

但这绝对是不可维护的...... 那么问题来了,设置DatabaseSeeder的时候就有问题了。

6一个想法?

【问题讨论】:

  • 你试过什么来调试这个问题?这甚至与 Composer 有关吗?

标签: composer-php laravel-7


【解决方案1】:

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

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

此文件夹与 PSR-4 不兼容,因此您必须将 composer.json 中的 classmap 与 Laravel 7 一起使用。

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

这是我的作曲家 json:

"autoload": {
        "psr-4": {
            "App\\": "app/",
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [
            "app/helpers.php"
        ]
    }

【讨论】:

  • helpers.php 如果您不在任何地方使用该文件,则不需要该文件
【解决方案2】:

我是这样解决的:

  • 我遵循了文档中关于 Sedeers 和工厂的说明
  • 我运行了 composer dump-autoload
  • 将作曲家更新到版本 2

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 2021-04-02
    • 2023-04-02
    • 2021-08-30
    • 2021-04-20
    • 2021-11-23
    • 1970-01-01
    • 2021-04-09
    • 2021-01-18
    相关资源
    最近更新 更多