kfirba / factor
使用 Laravel 模型工厂的简短、表达性方式。
Requires
- laravel/framework: ^5.6
Requires (Dev)
- fzaninotto/faker: ^1.7
- phpunit/phpunit: ^7.0
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个全局方法
make($model, $overrides = [], $times = 1)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 许可证。