#17 Blade foreach (intro to factories, faker and seeding)
이번 시간에는 지난번에 이어서 Blade의 사용법을 알아보겠다.
그중에서도 @foreach 문을 살펴 볼 것이다. @foreach문의 효과를 체험하기 위해선 역시나 데이터 풀이 많아야 된다.
그렇다면 100명의 유저를 생성하고 싶다고 했을 때 그것을 일일이 타이핑 할 것인가?
그런 상황에 대비해서 Faker라는 것이 있다. 일단 Factory부터 살펴보자. database/factories/ModelFactory.php의 코드를 보자.
Factory가 의미하는 바는 Factory의 의미와 일맥상통한다. 공장에서 대량의 물량을 찍어내듯 테스트정보들을 기준에 맞게 대량으로 찍어내는 공장과 같은 것을 의미한다.
$factory->define(App\User::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
//그냥 secret으로 두고 암호화를 안시킨이유는 전 시간에 이미 setter로 bcrypt를 구현해놓았기 때문이다.
'password' => $password ?: $password = 'secret',
'remember_token' => str_random(10),
];
});
위의 코드는 User model에 들어있는 요소들에 각각 넣어줄 Faker를 정의해준다.
User 모델에 뭐가 들어있는지 기억이 안난다면 다시 app/User.php를 볼것을 추천한다.
그렇다면 아까말한 100명의 가짜유저들은 어떻게 생성할까? database/seeds/DatabaseSeeder.php를 살펴보자.
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\User::class, 100)->create();
}
}
정말 간단한 코드이다 factory에서 정의한 User Faker 형식대로 100개의 Faker User를 Create하는 코드이다.
자 이제 모든 준비는 끝났다.
실제로 코드를 실행하면 100명의 가짜유저들이 생기는 지 확인해보자.
터미널을 열고 다음과 같은 명령어를 친다.
artisan migrate:refresh
위의 명령어는 DB테이블을 다시 다 지우는 역할을 한다.
artisan db:seed
그 다음에 위의 명령어를 실행한다. 그렇게되면 아까 run()에 입력해두었던 코드가 실행되어 100명의 페이커가 생긴다.
페이지에서 확인해보자. 저번에 만들어두었던 views/admin/users/index.blade.php를 들어가서 코드를 다음과 같이 수정한다.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div col-md-6 col-md-offset-3>
<ul class="list-group">
@foreach($users as $user)
<li class="list-group-item" style="margin-top: 20px;">{!! $user->name!!}
<span class="pull-right clearfix">
//diffForHumans는 남은시간을 사람들이 확인하기 쉬운형태로 변환해준다
Joined {{$user->created_at->diffForHumans()}}
<button class="btn btn-xs btn-primary">Follow</button>
</span>
</li>
@endforeach
</ul>
</div>
</div>
</div>
@endsection
세부적인 코드에 대한 설명을 생략하도록 하겠다.
저렇게 코딩을 하고 localhost:8000/users에 들어가보면 100명의 사람들이 생성되어 있는 목록을 확인할 수 있다.