13장 입력 값 유효성 검사

13.1. 유효성 검사 기본기

// 코드 13-1 app/Http/routes.php

Route::resource('articles', 'ArticlesController');

13.1.1. 전송 폼 만들기

// 코드 13-2 app/Http/Controllers/ArticlesController.php

public function create()
{
    return view('articles.create');
}
<!-- // 코드 13-3 resources/views/articles/create.blade.php -->

@extends('layouts.app')

@section('content')
  <div class="container">
    <h1>새 포럼 글 쓰기</h1>

    <hr/>

    <form action="{{ route('articles.store') }}" method="POST">
      {!! csrf_field() !!}

      <div class="form-group {{ $errors->has('title') ? 'has-error' : '' }}">
        <label for="title">제목</label>
        <input type="text" name="title" id="title" value="{{ old('title') }}" class="form-control"/>
        {!! $errors->first('title', '<span class="form-error">:message</span>') !!}
      </div>

      <div class="form-group {{ $errors->has('content') ? 'has-error' : '' }}">
        <label for="content">본문</label>
        <textarea name="content" id="content" rows="10" class="form-control">{{ old('content') }}</textarea>
        {!! $errors->first('content', '<span class="form-error">:message</span>') !!}
      </div>

      <div class="form-group">
        <button type="submit" class="btn btn-primary">
          저장하기
        </button>
      </div>
    </form>
  </div>
@stop

13.1.2. 컨트롤러 로직 추가

// 코드 13-4 app/Http/Controllers/ArticlesController.php

class ArticlesController extends Controller
{
    public function store(Request $request)
    {
        $rules = [
            'title'   => ['required'],
            'content' => ['required', 'min:10'],
        ];

        $validator = \Validator::make($request->all(), $rules);

        if ($validator->fails()) {
            return back()->withErrors($validator)
                         ->withInput();
        }

        $article = \App\User::find(1)->articles()
                                     ->create($request->all());

        if (! $article) {
            return back()->with('flash_message', '글이 저장되지 않았습니다.')
                         ->withInput();
        }

        return redirect(route('articles.index'))
            ->with('flash_message', '작성하신 글이 저장되었습니다.');
    }

    // ...
}

13.1.3. 플래시 메시지

<!-- // 코드 13-5 resources/views/layouts/app.blade.php -->

  <!-- //생략 -->
</nav>

@if(session()->has('flash_message'))
  <div class="alert alert-info" role="alert">
   {{ session('flash_message') }}
  </div>
@endif

@yield('content')

<!-- //생략 -->

그림 13-1 플래시 메시지

13.1.4. 오류 메시지 사용자화

// 코드 13-6 config/app.php

return [
    // ...
    'locale' => 'ko',
]
// 코드 13-7 app/Http/Controllers/ArticlesController.php

public function store(Request $request)
{
    $rules = [...];

    $messages = [
        'title.required' => '제목은 필수 입력 항목입니다.',
        'content.required' => '본문은 필수 입력 항목입니다.',
        'content.min' => '본문은 최소 :min 글자 이상이 필요합니다.',
    ];

    $validator = \Validator::make($request->all(), $rules, $messages);

    // ...
}

그림 13-2 한글로 표현된 유효성 검사 오류 표시

13.2. 트레이트의 메서드 이용

// 코드 13-8 app/Http/Controllers/ArticlesController.php

    public function store(Request $request)
    {
        $rules = [...];
        $messages = [...];

        $this->validate($request, $rules, $messages);

        $article = \App\User::find(1)->articles()
                                     ->create($request->all());

        if (! $article) { ... }

        return ...
    }

13.3. 폼 리퀘스트 클래스 이용

# 콘솔 13-1 폼 리퀘스트 클래스 뼈대 코드 만들기

$ php artisan make:request ArticlesRequest
// 코드 13-9 app/Http/Requests/ArticlesRequest.php

class ArticlesRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title'   => ['required'],
            'content' => ['required', 'min:10'],
        ];
    }

    public function messages()
    {
        return [
            'required' => ':attribute은(는) 필수 입력 항목입니다.',
            'min' => ':attribute은(는) 최소 :min 글자 이상이 필요합니다.',
        ];
    }

    public function attributes()
    {
        return [
            'title' => '제목',
            'content' => '본문',
        ];
    }
}
// 코드 13-10 app/Http/Controllers/ArticlesController.php

public function store(\App\Http\Requests\ArticlesRequest $request)
{
    $article = \App\User::find(1)->articles()
                                 ->create($request->all());

    if (! $article) {
        return back()->with('flash_message', '글이 저장되지 않았습니다.')
                     ->withInput();
    }

    return redirect(route('articles.index'))->with('flash_message', '작성하신 글이 저장되었습니다.');
}

13.4. 마치며

$ git commit -m '입력 값 유효성 검사'
$ git tag 1013-validation

results matching ""

    No results matching ""