validate

blade์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„

  • {!! csrf_field() !!} : crsf๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด _tokenํ‚ค๋ฅผ ๊ฐ€์ง„ ์ˆจ์€ ํ•„๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜์ธ๋ฐ, ์ด ํ•จ์ˆ˜๊ฐ€ ์ถœ๋ ฅํ•œ htmlํƒœ๊ทธ๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด {!! !!}๋ฌธ๋ฒ•์„ ์‚ฌ์šฉ

  • {{old('title')}} = old() : ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•ด์„œ ์ด ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ–ˆ๋˜ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋กœ ์„ธ์…˜์— ์ธ์ž๋กœ ๋„˜๊ธด ํ‚ค๊ฐ€ ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Controller ์ž‘์„ฑ

1. ๊ธฐ๋ณธ๋ฐฉ๋ฒ•

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','์ž‘์„ฑํ•˜์‹  ๊ธ€์ด ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
}
  • $rules : ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•  ๋ฐฐ์—ด๋กœ ์—ฐ๊ด€๋œ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜ required|min:10์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•ด๋„ ๋œ๋‹ค.

  • $validator : \Validator::make())๋ฉ”์„œ๋“œ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฒ€์‚ฌ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ์ด๊ณ , ๋‘๋ฒˆ์งธ๊ฐ€ ๊ทœ์น™์ด๋‹ค.

    • $validator()->passes() : ๊ฒ€์‚ฌ ์„ฑ๊ณต์‹œ true

    • $validator()->fails() : ๊ฒ€์‚ฌ ์‹คํŒจ์‹œ true

  • back() : ์ด์ „ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ redirect(route('articles.create'))์™€ ๊ฐ™๋‹ค.

    • withErrors() : ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ฒ€์‚ฌ ์‹คํŒจ ์ด์œ ๋ฅผ ์„ธ์…˜์—๋‹ค ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ

    • withInput() : ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๋Š” ์—ญํ• ๋กœ view์˜ old()ํ•จ์ˆ˜๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.

    • with() : ์ธ์ž๋กœ ๋ฐ›์€ key-value ์Œ์„ ์„ธ์…˜์— ์ €์žฅํ•˜๋Š” ์—ญํ• ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

์ž…๋ ฅํผ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€ ์„ค์ •

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

        $massages = [
            'title.required' => '์ œ๋ชฉ์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.',
            'content.required' => '๋ณธ๋ฌธ์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.',
            'content.min' => '๋ณธ๋ฌธ์€ ์ตœ์†Œ :min ๊ธ€์ž ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.',
        ]

        $validator = \Validator::make($request->all(), $rules, $massages);
        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','์ž‘์„ฑํ•˜์‹  ๊ธ€์ด ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
}

$validator์˜ ๊ฐ’์—๋Š” ์˜์–ด๊ฐ’์ด ์ €์žฅ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ์˜์–ด๋กœ ํ‘œ์‹œ๋˜๋Š”๋ฐ ์ „์—ญ ์–ธ์–ด ์„ค์ •์„ ํ•œ๊ธ€๋กœ ๋ฐ”๊พธ์–ด๋„ ์˜์–ด๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์ด๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์–ธ์–ด ํŒŒ์ผ์ด ์—†์–ด์„œ์ด๋‹ค. ์ด๋Š” ์œ„์ฝ”๋“œ์™€ ๊ฐ™์ด make()๋ฉ”์„œ๋“œ์˜ ์„ธ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ •์˜ํ•œ ๋ฐฐ์—ด์„ ์ฃผ๋ฉด ํ•œ๊ธ€๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2. ํŠธ๋ ˆ์ดํŠธ ๋ฉ”์„œ๋“œ ์ด์šฉ

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

        $massages = [
            'title.required' => '์ œ๋ชฉ์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.',
            'content.required' => '๋ณธ๋ฌธ์€ ํ•„์ˆ˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.',
            'content.min' => '๋ณธ๋ฌธ์€ ์ตœ์†Œ :min ๊ธ€์ž ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.',
        ]

        $this->validate($request->all(), $rules, $massages);
      
        $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','์ž‘์„ฑํ•˜์‹  ๊ธ€์ด ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
}

์ƒ์†๋ฐ›์€ Controller๋Š” Illuminate\Foundation\Validation\ValidatesRequestsํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ž„ํฌํŠธ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด ํด๋ž˜์Šค์˜ validate()๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ 1๋ฒˆ์˜ ๋ฐฉ๋ฒ•์ธ \Validator::make()์™€ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ํผ ๋ฆฌํ€˜์ŠคํŠธ ํด๋ž˜์Šค ์ด์šฉ

php artisan make:request ArticlesRequest ๋ช…๋ น์–ด๋กœ ํผ ๋ฆฌํ€˜์ŠคํŠธ ํด๋ ˆ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด app/Http/Requests๋””๋ ‰ํ† ๋ฆฌ ๋ฐ‘์— ์ƒ์„ฑ์ด ๋œ๋‹ค.

//ArticleRequest
class ArticleRequest extends FormRequest
{
    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' => '๋ณธ๋ฌธ',
        ];
    }
}

//ArticlesController
class ArticlesController extends Controller{
    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','์ž‘์„ฑํ•˜์‹  ๊ธ€์ด ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
}
  • authorize() : ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ผ์„ ์ˆ˜ํ–‰

  • rules() : ์—ญํ• ๋“ค ์ •์˜

  • messages() : ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€๋“ค ์ •์˜

  • attributes() : ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ํ‘œ์‹œํ•  ํ•„๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค์Šคํ…€ํ•˜์—ฌ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ•„๋“œ ์ด๋ฆ„์„ default๋กœ ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€์— ํ‘œ์‹œ๋œ๋‹ค.

Controller์˜ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Request๊ฐ€ ์•„๋‹Œ ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ Request๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋ฉด ๋ฉ”์„œ๋“œ๋‚ด์—์„œ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ ๋กœ์ง์ด ๋น ์ ธ๋„ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Last updated