Как использовать фабрику / фейкер Laravel с моделью, в которой есть конструктор с параметрами? - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в работе с фиктивными фиктивными данными Laravel.Мне любопытно, как я могу запустить свою фабрику из тинкера и заставить ее использовать конструктор модели, который (в данном случае) принимает два целочисленных параметра.

Мои исследования, посвященные SO и Googs, не смогли указать мне правильное направление для решения этой конкретной ситуации.Следующий код предназначен только для тестирования / edu, поэтому я попытался использовать поставщика услуг (что может быть проблемой).

Вот настройка, у меня есть моя модель:

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: Аргумент 1, передаваемый в App / Doombot :: __ construct (), должен иметь тип integer, указанный массив, вызываемый в /FactoryBuilder.php в строке 292

Но если я закомментирую свой конструктор моделей, мои make() вызовы приведут к ожидаемым результатам:

App\Doombot {#2942
     model_id: 2,
     weapon_id: 2,
     name: "Dannie",
   }

Для меня имеет смысл то, что DoombotsFactory пытается создать Doombot при возврате, без использованияПоставщик услуг, просто используя значения в массиве.Таким образом, фактический вызов конструктора объектов происходит на return [<array_values>]?Правильно ли это мышление?

Но есть ли способ заставить его использовать поставщика услуг, чтобы соответствующие параметры уже были установлены для каждой вновь созданной фиктивной записи?

По сути, я бы хотел использовать фейкер для создания имени: (Удаление узлов '<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;

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...