我刚接触laravel的factory / faker虚拟数据生成。我很好奇如何从修补匠那里运行我的工厂,并让它使用模型的构造函数(在这种情况下)采用两个整数参数。
我对S.O.的研究和Googs,未能为我指出正确的方向来处理这种特殊情况。以下代码仅用于测试/教育,这就是为什么我尝试使用服务提供商的原因(可能是问题所在)。
这是设置,我有我的模型:
Doombot.php
class Doombot extends Model
{
public $timestamps = false;
public $model_id;
public $weapon_id;
public $name;
public function __construct(int $model_id, int $weapon_id)
{
$this->model_id = $model_id;
$this->weapon_id = $weapon_id;
}
}
我有一个服务提供者,通过传递构造函数参数来初始化一个新创建的(带有类型提示的)Doombot:
DoombotsServiceProvider.php
public function register()
{
$this->app->bind(Doombot::class, function(){
$model_id = random_int(1, 2);
$weapon_id = random_int(1, 2);
return new Doombot($model_id, $weapon_id);
});
}
所以现在当我创建Doombot时,我已经在对象中设置了参数。大。然后我有我的工厂:
DoombotsFactory.php
$factory->define(Doombot::class, function (Faker $faker) {
return [
'model_id' => $faker->numberBetween(1, 2),
'weapon_id' => $faker->numberBetween(1, 2),
'name' => $faker->firstName
];
});
当我使用以下方法在Tinker中运行上述操作时:
factory(App\Doombot::class)->make()
我得到:
TypeError:传递给App / Doombot :: __ construct()的参数1必须为整数类型, 给定的数组,在第292行的/FactoryBuilder.php中调用
但是如果我注释掉模型构造函数,我的make()
调用会产生预期的结果:
App\Doombot {#2942
model_id: 2,
weapon_id: 2,
name: "Dannie",
}
对我来说有意义的是,DoombotsFactory试图在返回时创建Doombot,而不使用Service Provider,仅通过使用数组中的值即可。因此,对象实际的构造函数调用发生在return [<array_values>]
上吗?这种思路正确吗?
但是有什么方法可以让它使用服务提供者,以便已经为每个新创建的虚拟记录设置了正确的参数?
从本质上讲,我只想使用fakerr来产生一个名称:(删除'<field_name>' => $faker->numberBetween(1,2)
节点无济于事。)
假设的DoombotsFactory.php
$factory->define(Doombot::class, function (Faker $faker) {
// create doombot object with the parameters set upon creation
$obj = new Doombot;
// Since model_id and weapon_id have been set, add the name property
$obj->name => $faker->firstName
// somehow return this, but I believe only arrays are allowed
return $obj;
});