在拉拉维尔工厂,与"state"和"defineAs"有什么区别?



使用方法state和方法defineAs

state只是基本方法的扩展名,而defineAs是一个完全不同的定义?您能否提出一些示例以使其更容易理解?

方法statedefineAs的目的完全不同。

definedefineAs

您使用define方法为模型注册工厂,您可以使用类和回调提供。例如,如果要为User模型创建工厂,则将其注册:

$factory->define(AppUser::class, function (Faker $faker) {
    // set values here
});

然后,您会像这样致电工厂:

factory(AppUser::class)->make();

但是,有时您可能希望使用名称而不是班级注册工厂,因此您可以这样称呼工厂:

factory('user')->make();

这就是defineAs所在的位置:defineAs接受类(例如:AppUser::class(一个名称。例如:

$factory->define(AppUser::class, 'user', function (Faker $faker) {
    // set values here
});

defineAs尚未记录,但您可以在雄辩的来源中找到它。


工厂状态

工厂状态用于生成具有特定属性集的模型:

状态允许您定义可以通过任何组合应用于模型工厂的离散修改。

例如,您的User模型可能具有额外的is_admin字段,该字段确定用户是否是管理员。您可以创建一个状态以允许通过工厂生成管理员的用户。

首先,您定义状态(其中 admin是名称(:

$factory->state(AppUser::class, 'admin', [
    'is_admin' => true,
]);

然后生成用户时,您将传递到admin状态:

factory(AppUser::class)->states('admin')->make();

这意味着您可以拥有一个用于User模型的工厂,该工厂支持用户的许多不同类型;您可以在同一工厂内为被禁止的用户或与其帐户相关的图片的用户创建一个状态。这是非常有益的,因为这意味着开发人员在使用工厂时不需要关注基础结构,并且如果基础结构发生变化(例如:is_admin成为administrator_at(,只有工厂需要更改。

以前的答案说 defineAs就像一个别名或速记名称,但这是错误的!如果您制作:

factory('user')->create(); //it won't work

defineAs和状态几乎相同,略有差异。在5.2个状态之前的版本中称为状态https://laravel.com/docs/5.2/testing#model-factores

因此,defineAs在创建模型时创建不同的模型类型,以原始模型设置这样的常见属性:

$factory->define(AppUser::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});
$factory->defineAs(AppUser::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(AppUser::class);
    return array_merge($user, ['admin' => true]);
});

states的做法相同,但以这样的方式进行了更好的方式:

$factory->state(AppUser::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});

甚至没有回调,只是一个数组:

$factory->state(AppUser::class, 'address', [
    'admin' => true,
});

另一个区别是,一旦对象持续在数据库中,define就会发射事件(余后创建(,而states将发射事件afterCreatingState。另外,您可以创建一个具有这样多个状态的对象:

factory(AppUser::class)->states('admin', 'disable')->create()

最新更新