Laravel 5 - Form Request

FormRequest

라라벨 5에 새로 FormRequest라는 기능이 추가되었습니다. 기존 라라벨 4에서 사용하던 Validator를 이용해서 좀 더 간편하게 폼검증을 하는 기능입니다. 간단한 폼으로 사용법을 알아보겠습니다.

라우트 작성

예제를 위해 간단한 form 뷰 과 해당 폼을 처리하는 라우트를 추가합니다.

Route::get('/', function() {
    return View::make('user.updateForm');

});

Route::post('/', 'UpdateUserController@updateUser');

뷰 (user/updateForm)

/resources/views/user 폴더에 updateForm.blade.php를 추가해줍니다.

라라벨 5에서는 뷰 파일의 위치가 /resources로 변경됬습니다.

<!doctype html>
<html>
<head>
    <title>Test</title>
</head>
<body>

@foreach ($errors->all() as $error)
    <p>{{ $error }}</p>
@endforeach

<form method='post'>
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name='name' value='Name'>
    <input type="text" name='email' value='test@test.com'>

    <input type="submit">

</form>

</body>
</html>

컨트롤러 추가

/app/Http/Controllers에 UpdateUserController.php를 추가해줍니다.

namespace App\Http\Controllers;

use App\Http\Requests\UpdateUserRequest;

class UpdateUserController extends Controller
{
    public function updateUser(UpdateUserRequest $request)
    {
        // do something
    }
}

UpdateUserRequest 추가

위에 추가한 updateForm에서 폼을 전송시 name과 email 필드들을 검증하는 FormRequest를 /app/Http/Requests/UpdateUserRequest.php에 추가합니다. 아래는 FormRequest가 요구하는 최소사항 입니다.

namespace App\Http\Requests;

class UpdateUserRequest extends Request
{

    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email'
        ];
    }

    public function authorize()
    {
        return true;
    }
}

FormRequest는 현제 처리하는 Request에 필요한 벨리데이션 규칙을 반환하는 rules() 함수와
해당 유저가 현재 처리 중인 Request를 실행할 권한이 있나 없나를 반환하는 authorize()가 필요합니다.

이제 브라우저에서 라라벨5를 실행한 후 접속하면 위에 작성한 폼이 보입니다.

첫 번째 텍스트 필드에서 Name을 제거한 후 Submit을 누르면 에러 메세지와 함께 다시 첫 페이즈로 돌아옵니다.

컨트롤러에 한줄의 코딩도 없이 간단하게 폼검증이 가능합니다!!

authoirze() 같은 경우는 아래처럼 로그인된 사용자만 접근이 가능하도록 활용 가능합니다.

namespace App\Http\Requests;

use Auth;

class UpdateUserRequest extends Request
{
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email'
        ];
    }

    public function authorize()
    {
        if (!Auth::check()) {
            return false;
        }

        return true;
    }
}

authoirze()를 변경하시고 다시 폼을 전송하면 화면에 "Forbidden" 이라는 텍스트만 나옵니다.

authoirze() false 반환시 표시되는 값 변경하기

authorize()에서 false가 반환되면 기본적으로 Illuminate\Foundation\Http\FormRequest 클라스에 포함되어 있는 forbiddenResponse() 함수가 실행됩니다. forbiddenResponse 함수의 내용을 보면 아래처럼 View없이 Forbidden 텍스트와 HTTP Status Code 403을 반환합니다.

public function forbiddenResponse()
{
    return new Response('Forbidden', 403);
}

특정 View를 출력하려면 해당 함수를 오버라이드 하면 됩니다.

수정된 UpdateUserRequest.php

namespace App\Http\Requests;

use Auth;
use Response;

class UpdateUserRequest extends Request
{
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email'
        ];
    }

    public function authorize()
    {
        if (!Auth::check()) {
            return false;
        }

        return true;
    }

    public function forbiddenResponse()
    {
        return Response::make(view('forbidden'), 403);
    }
}

/resources/views/forbidden.blade.php

<!doctype html>
<html>
<head>
    <title>로그인 필요</title>
</head>
<body>

<div>로그인 해주십시오.</div>

</body>
</html>

다시 form을 전송하면 forbidden.blade.php가 출력됩니다.

검증 실패

폼 검증이 실패하면 자동으로 이전 페이지로 에러 메세지와 함께 이동됩니다. 해당 과정을 처리하는 로직은 Illuminate\Foundation\Http\FormRequest.php의 function response()에 정의되어 있습니다.

public function response(array $errors)
{
    if ($this->ajax())
    {
        return new JsonResponse($errors, 422);
    }
    return $this->redirector->to($this->getRedirectUrl())
                                    ->withInput($this->except($this->dontFlash))
                                    ->withErrors($errors, $this->errorBag);
}

forbiddenResponse와 마찬가지로 response도 오버라이드해서 기본 처리과정을 변경 가능합니다.

예를들어 Rest API 서버에서 폼검증 실패시 무조건 JSON 을 반환하려면 아래처럼 소스 수정가능합니다.

namespace App\Http\Requests;

use Auth;
use Response;

class UpdateUserRequest extends Request
{
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email'
        ];
    }

    public function authorize()
    {
        if (!Auth::check()) {
            return false;
        }

        return true;
    }

    public function forbiddenResponse()
    {
        return Response::make(view('forbidden'), 403);
    }

    public function response(array $errors)
    {
        return new JsonResponse($errors, 422);
    }
}

아직 남은 부분들은 추후에 추가됩니다.

2015.02.05 - 첫번째 버젼 업로드

comments powered by Disqus