kfirba/factor

使用 Laravel 模型工厂的简短、表达性方式。

v1.0.1 2018-02-22 05:35 UTC

This package is auto-updated.

Last update: 2024-09-17 17:12:34 UTC


README

使用 Laravel 模型工厂的简短、表达性方式。

安装

$ composer require --dev kfirba/factor

用法

我已撰写了一篇更详细的博客关于此包:kfirba/factor - 简短、表达性方式使用 Laravel 的工厂。请务必查看!

此包注册了2个全局方法

  1. make($model, $overrides = [], $times = 1)
  2. create($model, $overrides = [], $times = 1)

这些方法几乎与 Illuminate\Database\Eloquent\Factory 提供的 create()make() 方法相同(通常您使用 factory() 全局方法来获取工厂实例)。

以下示例适用于 create()make() 方法。唯一不同的是,create() 方法还会持久化生成的实例。

$user = make(User::class);
// -> Equivalent to `factory(User::class)->make()`

$user = make(User::class, $overrides);
// -> Equivalent to `factory(User::class)->make($overrides);`

$user = make(User::class, $overrides, $times);
// -> Equivalent to `factory(User::class, $times)->make($overrides);

看起来 create()make() 方法只是 factory()->{$method}() 的简单别名,但这里很有趣。

我想做决定!

有时可能觉得将我们想要构建的对象数量作为第二个参数传递,而不是覆盖,是“正确”的。Factor 允许您这样做。如果您将整数作为第二个参数传递,它将假设您正在尝试设置要创建的对象数量

make(User::class, 3);
// Equivalent to:
make(User::class, [], 3);

make(User::class, 3, ['name' => 'John']);
// Equivalent to:
make(User::class, ['name' => 'John'], 3);

状态

因此,我们决定使用一个简写来调用 factory()->create(),但是,当我们想要给它一个特定的状态时会发生什么?最简单的解决方案是稍微调整一下 make()create() 方法,使其接受一个额外的参数。

然而,参数列表变得相当长,而且由于 $overrides$times 参数都是可选的,所以那样做会变得一团糟。

此包允许您使用表达性语法来声明您的状态

// Given the factory definition [name => 'Fake User'] and the state 'admin' [name => 'Admin']:
Class User 
{
    public function callMe() { echo 'called'; }
}

$user = make(User::class);
echo $user->name;
// -> 'Fake User'
echo $user->callMe();
// -> 'called';

$admin = make(User::class)->states('admin');
echo $admin->name;
// -> 'Admin'
echo $admin->callMe();
// -> 'called';

请特别注意上面的 admin 状态。我们直接在 make() 返回的值上调用 states() 方法,并且我们仍然能够访问实际实例的任何属性或方法。这正是此包提供的额外优势。

小的注意事项(立即创建模型)

有时我们只想创建模型作为测试设置的组成部分,但我们实际上根本不需要直接与之交互。Factor 不会立即创建模型,而是在需要时实时决定是否创建。如果您依赖于模型仅在数据库中存在,则此行为将破坏您的测试。为了克服这个缺点,Factor 还提供了一个 now() 方法,它允许您使用其优雅、表达性的语法,但会立即创建模型

create(User::class);
// -> 'Kfirba\Factor\PendingModel'
create(User::class)->now();
// -> 'App\User'

create(User::class)->states('admin');
// -> 'Kfirba\Factor\PendingModel'
create(User::class)->states('admin')->now();
// -> 'App\User'

许可证

Factor 是开源软件,许可证为 MIT 许可证