如何将Laravel的factory / faker与带有构造函数并带有参数的模型一起使用?

时间:2019-02-27 12:03:44

标签: laravel constructor model factory faker

我刚接触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;

});

0 个答案:

没有答案