建立Factory的章節在laravel是合併在Testing :Database
的章節裡,因為Factory 可以幫助我們快速建立需要的DB資料,當然不侷限在只有test中,這邊把它拿出來說明。
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 [
//
];
});
這邊開始用一建立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,它包裝了很多生成不同型態且隨機資料的方法(包含地址,各種名稱,日期,圖片位置等等),在建立測試資料的時候不妨都去查一下,說不定也有意想不到的結果。
有時候我們在建立某個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的部分也會介紹到。
參考連結: