Laravel 在子目录中调用播种机 - 找不到类

Laravel calling seeder in subdirectory - Class not found

提问人:Danaq 提问时间:1/17/2022 更新时间:1/17/2022 访问量:1248

问:

几天前,当我尝试通过 .Artisan::call

在 bash 上,此命令工作正常:

php artisan db:seed --class=Database\\Seeders\\Testing\\StagingTestDataSeeder

但我想按以下方式执行它:

Artisan::call("db:seed --class=Database\\Seeders\\Testing\\StagingTestDataSeeder");

结果是:这是绝对正确的,因为参数中没有命名空间分隔符。由于参数中没有分隔符,-method 只是将参数连接到数据库种子作者
的基本命名空间(见下文)。
Target class [Database\\Seeders\\DatabaseSeedersTestingStagingTestDataSeeder] does not exist.getSeederif (strpos($class, '\\') === false) {

因为它适用于 bash,所以我认为命名空间或文件位置没有任何错误。
我在
Illuminate\Database\Console\Seeds\SeedCommand.php::66

/**
     * Get a seeder instance from the container.
     *
     * @return \Illuminate\Database\Seeder
     */
    protected function getSeeder()
    {
        $class = $this->input->getArgument('class') ?? $this->input->getOption('class');
        dump($this->options());
        dump($this->arguments());
        dump($class);
        if (strpos($class, '\\') === false) {
            $class = 'Database\\Seeders\\' . $class;
        }

        if (
            $class === 'Database\\Seeders\\DatabaseSeeder' &&
            !class_exists($class)
        ) {
            $class = 'DatabaseSeeder';
        }

        return $this->laravel->make($class)
            ->setContainer($this->laravel)
            ->setCommand($this);
    }

打印以下内容:

array:10 [▼
  "class" => "DatabaseSeedersTestingStagingTestDataSeeder"
  "database" => null
  "force" => false
  "help" => false
  "quiet" => false
  "verbose" => false
  "version" => false
  "ansi" => null
  "no-interaction" => false
  "env" => null
]
array:2 [▼
  "command" => "db:seed"
  "class" => null
]
"DatabaseSeedersTestingStagingTestDataSeeder"

不知何故,转义的反斜杠没有到达 SeedCommand-class 的 getSeeder-method。
我知道我可以通过 require 加载带有纯 PHP 的类,或者将 deep 命名空间添加到 .但由于这不是 laravel 的预期用途,我想弄清楚如何使用板载功能来做到这一点。
composer.json

----后来进行了一些测试----

我发现我可以将类/命名空间值作为选项(带有)以及参数(只是命名空间)传递给 .所以现在有效。--class=SeedCommand.php Artisan::call("db:seed Database\\\\Seeders\\\\Testing\\\\StagingTestDataSeeder");

有人可以解释那里发生了什么吗?我完全不明白为什么我需要传递双倍的反斜杠。似乎这个论点被解释了两次。
最近更新了吗?
SeedCommand

php laravel 命名空间 laravel-seeding

评论


答:

4赞 Davit Zeynalyan 1/17/2022 #1

Artisan::call('db:seed', ['--class' => Database\Seeders\Testing\StagingTestDataSeeder]);

查看更多详情 https://laravel.com/docs/8.x/artisan#programmatically-executing-commands

评论

0赞 Danaq 1/17/2022
好的,谢谢。这似乎有效。但是您能解释一下为什么 bash 调用的语法在以编程方式调用时停止工作吗?
0赞 Davit Zeynalyan 1/17/2022
我不知道需要检查