Laravel正在子目录中调用种子程序-找不到类


几天前,当我试图通过Artisan::call在子目录中执行种子程序时,Laravel(目前为8.12|php 7.4.14(开始抛出错误。

在bash上,这个命令运行良好:

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

但我想执行它作为:

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

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

因为它适用于bash,所以我不认为命名空间或文件位置有任何错误
我在IlluminateDatabaseConsoleSeedsSeedCommand.php::66中转储了一些数据

/**
* Get a seeder instance from the container.
*
* @return IlluminateDatabaseSeeder
*/
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类的getSeeder方法
我知道我可以通过require用纯PHP加载该类,或者将深层命名空间添加到composer.json中。但由于这不是laravel的预期用途,我想弄清楚如何使用板载功能。

----几次测试之后----

我发现我可以将类/名称空间值作为选项(使用--class=(以及参数(仅名称空间(传递给SeedCommand.php。所以Artisan::call("db:seed Database\\Seeders\\Testing\\StagingTestDataSeeder");现在起作用了。

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

使用

Artisan::call('db:seed', ['--class' => DatabaseSeedersTestingStagingTestDataSeeder]);

查看更多细节https://laravel.com/docs/8.x/artisan#programmatically-执行命令

最新更新