Я новичок в работе с фиктивными фиктивными данными 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;
});