提问人:Danaq 提问时间:1/17/2022 更新时间:1/17/2022 访问量:1248
Laravel 在子目录中调用播种机 - 找不到类
Laravel calling seeder in subdirectory - Class not found
问:
几天前,当我尝试通过 .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.
getSeeder
if (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
答:
用
Artisan::call('db:seed', ['--class' => Database\Seeders\Testing\StagingTestDataSeeder]);
查看更多详情 https://laravel.com/docs/8.x/artisan#programmatically-executing-commands
评论