【问题标题】:In Laravel Factories, what is the difference from "state" and "defineAs"?在 Laravel 工厂中,“state”和“defineAs”有什么区别?
【发布时间】:2018-10-03 09:45:14
【问题描述】:

在 Laravel 的工厂中,使用方法 state 和方法 defineAs 有什么区别?

state 只是基本方法的扩展,defineAs 是完全不同的定义吗?能否举一些例子让大家更容易理解?

【问题讨论】:

    标签: laravel laravel-seeding


    【解决方案1】:

    之前的答案说defineAs 就像别名或简写名称,但这是错误的!如果你做:

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

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

    所以defineAs 在创建模型时会创建一个不同的模型类型,基于原始模型设置公共属性,如下所示:

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

    虽然states 也在做同样的事情,但以一种更好的方式,如下所示:

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

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

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

    另一个区别是define 触发一个事件(afterCreating),一旦对象被持久化到数据库中,states 将触发一个事件afterCreatingState。 此外,您可以像这样创建具有多种状态的对象:

    factory(App\User::class)->states('admin', 'disable')->create()
    

    【讨论】:

      【解决方案2】:

      statedefineAs 方法的用途完全不同。

      definedefineAs

      您使用define 方法为模型注册一个工厂,该方法带有一个类和一个回调。例如,如果您正在为 User 模型创建工厂,那么您可以像这样注册它:

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

      然后你会这样调用工厂:

      factory(App\User::class)->make();
      

      但是,有时您可能希望使用名称而不是类来注册工厂,以便您可以这样调用工厂:

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

      这就是defineAs 的用武之地:defineAs 接受一个类(例如:App\User::class一个名称。例如:

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

      defineAs 没有记录,但您可以在 Eloquent source 中找到它。


      工厂状态

      Factory States 用于生成具有一组特定属性的模型:

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

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

      首先你定义你的状态(admin 是名字):

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

      然后在生成您的用户时,您传入admin 状态:

      factory(App\User::class)->states('admin')->make();
      

      这意味着您可以为您的User 模型创建一个支持许多不同类型用户的工厂;您可以为被禁止的用户或拥有与其帐户关联的图片的用户创建一个状态,所有这些都在同一个工厂内。这是额外的好处,因为这意味着开发人员在使用工厂时不需要关心底层结构,如果底层结构发生变化(例如:is_admin 变为 administrator_at),只需更改工厂即可。

      【讨论】:

      • 正确的用法是factory(User::class, 'admin')->make(),而不是factory('admin')->make()
      • @MaksimIvanov 你是绝对正确的,但那是他写的。 factory('admin')->make() 是您想要做的事情,factory(User::class, 'admin')->make() 是您要做的事情
      • 哦,我的困惑是关于 ->state & ->states 。谢谢。
      • Laravel 7.x 中删除了 defineAs 方法。见:Eloquent source 7.x
      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2015-03-15
      • 2012-06-30
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多