anahkiasen/fakable

此包已被弃用且不再维护。作者建议使用 thephpleague/factory-muffin 包。
此包最新版本(1.3.4)没有提供许可证信息。

允许创建和播种假 Eloquent 模型

1.3.4 2016-05-27 11:41 UTC

This package is auto-updated.

Last update: 2022-02-01 12:30:49 UTC


README

此包已弃用且将不再维护,我建议使用 Factory Muffin 代替

Fakable

允许创建和播种假 Eloquent 模型。这是一个 PHP 5.4+ 包。

可用于测试或生成种子中的假条目批量。

安装

$ composer require anahkiasen/fakable:dev-master

使用方法

基本使用

只需将特性添加到模型中,例如

use Fakable\FakableModel;

class MyModel extends Eloquent
{
  use FakableModel;
}

内置了许多默认值,用于配置哪些属性将被分配给哪些属性,但您可以通过修改模型上的 $fakable 属性来覆盖或添加到这些值

class User extends Eloquent
{
  /**
   * The fakable attributes
   *
   * @var array
   */
  protected $fakables = array(
    'nationality' => 'countryCode',
    'timzeone'    => ['numberBetween', [1, 415]],
  );
}

Fakable 在下面使用 Faker,因此您可以通过传递方法名或数组 ['method', [argument, argument]](如上所示)来调用 Faker 的任何方法。

从那时起,您可以在模型上调用多个方法来生成假实例

> User::fake()->toArray();
array(
  'id'          => 28,
  'name'        => 'Tempore ipsa aut dolorum sit quod.',
  'slug'        => 'tempore-ipsa-aut-dolorum-sit-quod',
  'age'         => 23,
  'biography'   => 'Culpa debitis dolorem quidem eius. Quis et voluptatibus est. Quia nulla rerum expedita magnam.',
  'email'       => 'nienow.donnie@spinkawisoky.com',
  'website'     => 'http://www.weissnat.com/',
  'address'     => '91274 Schmitt Light Suite 378',
  'country'     => 'Sudan',
  'city'        => 'North Twila',
  'private'     => false,
  'nationality' => 'RU'
)

您也可以通过调用 fakeMultiple(attributes, min, max) 来生成多个模型

User::fakeMultiple(array(
  'name' => 'foobar',
), 5, 10);

User::count() // 7

高级使用

要更精确地控制生成的假模型的流程,您可以这样做

User::fakable()

这将返回一个可以从其中设置各种选项的 Fakable 实例

User::fakable()
  ->setPool(10, 20) // Will generate 10 to 20 entries
  ->setPoolFromModel('Discussion', 2) // Will generate 2 users for every discussion
  ->setSaved(false) // Won't save anything to the database
  ->fakeModel() // Generated a single fake model, that's what ::fake() calls
  ->fakeMultiple() // Generate multiple models from the pool set previously

在假模型上设置属性

您还可以设置可能不是随机的假模型的属性

User::fakable()->fakeMultiple(array(
  'gender' => 'Male',
));

属性固定值

您不仅可以设置模型上的所有属性,还可以创建一个属性固定值文件来保存它们。此文件可以放在任何位置,可以是 PHP、YAML 或 JSON 文件。您可以通过将 Fakable\Fakable::$baseFixture 变量设置为路径来告诉 Fakable 在设置种子时或应用启动时在哪里找到它。

Fakable\Fakable::$baseFixture = app_path().'/tests/fixtures/fakable.yml';

例如,您还可以为特定的 Fakable 实例设置不同的文件

User::fakable()->setFixture(__DIR__.'/fixtures/user.json')->fakeModel()

该文件是一个简单的数组 [class => attributes],例如

User:
  name: 'name'
  age: ['numberBetween', [0, 20]]

关系

Fakable 也会在可能的情况下生成关系。大多数情况下,这是一个完全自动的过程,您只需将关系的名称添加到 fakable 属性中,并传递一个空签名即可。

protected $fakables = array(
  'discussions' => [],
);

您可以选择传递一个最小值和/或最大值来生成生成的关系数量。

protected $fakables = array(
  'discussions' => [10, 20],
);

请注意,目前这不适合 Has-type 关系:Fakable 只能从接收者的点进行生成(即 Belongs-type 关系)。

您唯一需要配置的关系是 morphTo 关系,因为,嗯,猜测它们的行为很痛苦。

class Image extends Eloquent
{
  protected $fakables = array(
    'illustrable' => [
      'relationType' => 'MorphTo',
      'forModels'    => ['User', 'Discussion']
    ],
  );
}

在这里,relationType 将告诉 Fakable 这是一个 MorphTo 关系,而 forModels 将指示它 Image 可能是何种模型的多态关系。

默认情况下,Fakable 将使用属性名作为外键(因此 illustrable 将查找 illustrable_typeillustrable_id),但您也可以在签名中传递一个 foreignKey 来指定。

class Image extends Eloquent
{
  protected $fakables = array(
    'illustrable' => [
      'foreignKey'   => 'imageable',
      'relationType' => 'MorphTo',
      'forModels'    => ['User', 'Discussion']
    ],
  );
}