LaravelのValidateの使い方を調べてみた:その2
こんにちは、システムエンジニアの今井です。
前回のブログでLaravelのValidateで「Validatorクラスを使う方法」を紹介しました。
今回は「Requestクラスのvalidateメソッドを使う方法」を紹介します。
※:今回の内容はほぼ前回のブログと内容が似ています。
前回のブログとは「⑥:app/Http/Controllers/HogeController.php を編集」の箇所が異なります。
前回のブログを既に閲覧している場合は「⑥:app/Http/Controllers/HogeController.php を編集」の箇所のみ見ていただければと思います。
今回紹介するValidation条件例として、前回と同じく以下4つのPOST値をチェックする前提で説明します。
email:必須、email形式
name:必須、255文字以内
title:任意、255文字以内
message:任意、1000文字以上、6000文字以内
環境情報
CentOS 7.7.1908
PHP 7.3.11
Laravel 6.4.0
composer 1.9.1
それでは、「Requestクラスのvalidationメソッドを使う方法」について紹介したいと思います。
①:Laravel自体を作成
composerを使って以下のコマンドを叩くと、実行したコマンドのカレントディレクトリにlaravel_sampleというディレクトリが作成されます。
composer create-project "laravel/laravel=6.4.0" --prefer-dist laravel_sample
②:HogeController.php の作成
※:以下の作業を行うとapp/Http/Controllers配下にHogeController.phpが作成されます。
cd laravel_sample php artisan make:controller HogeController
③:routes/web.php を編集
以下の設定で
/hogeのURLを開いた時にHogeControllerのindexアクションを呼び出します。
/hogeのURLにPOST通信したときにHogeControllerのpostアクションを呼び出します。
Route::get('hoge', 'HogeController@index'); Route::post('hoge', 'HogeController@post');
④:resources/view/hoge/index.blade.php の作成
/hogeのURLを開いた時に表示されるHTMLになります。
Bootstrap4.3.1を使っています。
{{old(‘xx’)}}はvalidationでエラーになった時に直前に入力していた値を表示します。
$errorsの箇所はエラーメッセージを表示します。
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width"> <title></title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> </head> <body> <div class="container"> <form action="/hoge" method="post"> {!! csrf_field() !!} <div class="form-group"> <label for="email">email:</label> <input type="text" name="email" id="email" class="form-control" value="{{old('email')}}"> @if ($errors->has('email')) <span class="text-danger">{{$errors->first('email')}}</span> @endif </div> <div class="form-group"> <label for="name">name:</label> <input type="text" name="name" id="name" class="form-control" value="{{old('name')}}"> @if ($errors->has('name')) <span class="text-danger">{{$errors->first('name')}}</span> @endif </div> <div class="form-group"> <label for="title">title:</label> <input type="text" name="title" id="title" class="form-control" value="{{old('title')}}"/> @if ($errors->has('title')) <span class="text-danger">{{$errors->first('title')}}</span> @endif </div> <div class="form-group"> <label for="message">message:</label> <textarea name="message" id="message" class="form-control">{{old('message')}}</textarea> @if ($errors->has('message')) <span class="text-danger">{{$errors->first('message')}}</span> @endif </div> <button class="btn btn-primary" type="submit">Submit form</button> </form> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>
⑤:resources/view/hoge/post.blade.php の作成
このファイルはvalidateを通過した時に表示されるページになります。POSTしたデータの内容が表示されます。
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title></title> </head> <body> <div> POST成功 <table> <tr> <td>email</td> <td>{{$validated['email']}}</td> </tr> <tr> <td>name</td> <td>{{$validated['name']}}</td> </tr> <tr> <td>title</td> <td>{{$validated['title']}}</td> </tr> <td>message</td> <td>{{$validated['message']}}</td> <tr> </table> </div> </body> </html>
⑥:app/Http/Controllers/HogeController.php を編集
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HogeController extends Controller { public function index() { return view('hoge.index'); } public function post(Request $request) { $rules = [ 'email'=> 'required|email', // emailフィールドは必須チェック、emailの形になっているかチェックを行う 'name' => 'required|max:255', // nameフィールドは必須チェック、255文字以内かをチェックする 'title' => 'nullable|max:255', // titleフィールドは任意入力、入力があった時は255文字以内かをチェックする 'message' => 'nullable|min:1000|max:6000', // messageフィールドは任意入力、入力があった時は1000文字以上かつ6000文字以内かをチェックする ]; $messages = [ 'email.required' => 'メールアドレスを入力してください。', // emailフィールドで入力がなかった時に表示されるエラーメッセージ 'email.email' => '正しいメールアドレスを入力してください。', // emailフィールドで正しいemail形式でなかった時に表示されるエラーメッセージ 'name.required' => '名前を入力してください。', // nameフィールドで入力がなかった時に表示されるエラーメッセージ 'name.max' => '名前は:max文字以内で入力してください。', // nameフィールドで255文字を超えた時に表示されるエラーメッセージ 'title.max' => 'タイトルは:max文字以内で入力してください。', // titleフィールドで255文字を超えた時に表示されるエラーメッセージ 'message.min' => 'メッセージは:min文字以上で入力してください。', // messageフィールドで1000文字未満の時に表示されるエラーメッセージ 'message.max' => 'メッセージは:max文字以内で入力してください。', // messageフィールドで6000文字を超えた時に表示されるエラーメッセージ ]; $validated = $request->validate($rules, $messages); return view('hoge.post')->with(['validated'=>$validated]); } }
⑦からは①~⑥で作成したものを動かしてみたいと思います。
⑦:以下のコマンドで 8000番ポートにアクセスできるようにします。
php artisan serve --host 0.0.0.0
⑧:ブラウザで8000番ポートで/hogeにアクセスします
⑦のコマンドを行ったサーバのIPアドレスが192.168.1.30として以下のURLでアクセスします。
http://192.168.1.30:8000/hoge
注)サーバで8000番ポートがiptablesやfirewalld等で閉じている場合は、あらかじめ開けておいてください。
以下のようなフォームが表示されます。
⑨:空っぽでSubmitボタンを押してみます
メールアドレスと名前の箇所は必須入力ですので、この2つでエラーが表示されました。
⑩:その他のエラーを出してみる
メールアドレスにふさわしくない形、名前に255文字以上、タイトルに255文字以上、メッセージに1000文字未満をいれてSubmitしてみます。条件に合わないのでエラーが表示されます。
⑪:正しい内容の値を入力しvalidateを通過してみます
以下のように正しい内容の値を入れてSubmitします。
Submitするとpost.blade.phpの内容が表示され、validateを通過することが確認できました。
まとめ
LaravelのRequestクラスのvalidateメソッドを使うことで、入力内容のチェックがすることができました。
簡単なValidateを行うだけであれば、この方法で問題ないかと思います。
ただ、チェックする項目が多くなるとController内にvalidateするために記述内容が増え、Controllerが肥大化してきます。
validateする処理を外部ファイル化しControllerの肥大化を防ぐために次回は「Requestクラスを継承して使う方法」を紹介できればと思います。