iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0

建立Factory的章節在laravel是合併在Testing :Database 的章節裡,因為Factory 可以幫助我們快速建立需要的DB資料,當然不侷限在只有test中,這邊把它拿出來說明。

使用方式

建立factory

php artisan make:factory ProductFactory --model=Product

--model: 可不帶,如果像上面帶的話要注意,它產生的model位置是App\Product,所以如果自己像之前提到的有把Model拆出來另一個資料夾的話,位置要記得改。

<?php

use Faker\Generator as Faker;

$factory->define(App\Entities\Product::class, function (Faker $faker) {
    return [
        //
    ];
});

編寫Factory

這邊開始用一建立laravel就已經提供的database/factories/UserFactory.php舉例,可以看到比較多的範例

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

其中可以看到我們用了一個Faker的library,它包裝了很多生成不同型態且隨機資料的方法(包含地址,各種名稱,日期,圖片位置等等),在建立測試資料的時候不妨都去查一下,說不定也有意想不到的結果。

定義不同狀態的factory

有時候我們在建立某個model的測試資料時,可能會因為他的 狀態 不同,所以特定某幾個屬性的資料就會不太一樣,這時候laravel有提供方法,讓我們不用在另外建立檔案使用。

5.2 之前的關鍵字 defineAs
5.3 之後的關鍵字 state

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

如果有需要的話也可以用Closure

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

應用

可以在需要的程式中加入需要的factory,以前一章提到的seed為例,可以在run裡面加入factory

public function run()
{
    //建立3個User
    $users = factory(App\User::class, 3)->make();

    //建立5個狀態為premium, normal的User
    $usersDifferent = factory(App\User::class, 5)->states('premium', 'normal')->make();

    //覆寫原本factory設定的值
    $usersOverriding = factory(App\User::class)->make([
      'name' => 'Peter',
    ]);
}

上面的這些make都可以改成create,如果改成create,會真的用Eloquent的 save method把資料save到DB,如果還需要更複雜的create寫法可以參考官網。


結論: 在工作中開發時,因為通常公司都已經會有資料了,factory比較常用的時機就會是測試的時候,不過如果是一個新的專案環境,在完全沒有資料的時候,factory就可以幫我們很快的建立多筆測試資料,在下一章tinker的部分也會介紹到。

參考連結:


上一篇
Day22-[DB 操作] Seeds
下一篇
Day24-[DB 操作] Tinker
系列文
30天快速上手Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言