Laravelのバリデーション方法とカスタマイズ方法を紹介します。
・バージョン
Laravel : 5.7
LaravelのバリデーションはFormRequestクラスを継承して実装します。
・App\Http\Requests\HogesRequest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HogesRequest extends FormRequest { /** * @return bool */ public function authorize() { return true; } /** * バリデーションルール * * @return array */ public function rules() { return [ 'tel' => ['required', 'regex:/^[0-9\-]+$/i', 'max:14'], ... ]; /** * バリデーションメッセージ * * @return array */ public function messages() { return [ "required" => "入力してください", ... ]; } /** * カラム名 * * @return array カラム名 */ public function attributes(){ return [ 'tel' => '電話番号', ... ]; } } |
一番上のメソッドであるauthorizeでは、リクエストに対する権限を設定します。例えば、現在ログイン中のユーザに権限がない場合「false」を返します。
Laravelのバリデーションをカスタマイズする方法
独自でバリデーションをカスタマイズする場合は、Ruleを継承して実装します。
今回は例として、hogeテーブルのIDが存在しているかをチェックするカスタムバリデーションを実装します。
以下のコマンドを実行することで、カスタムバリデーションのファイルがApp/Rules配下に自動生成されます。
1 | $ php artisan make:rule CheckId |
・App\Rules\CheckId.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use App\Hoge; class CheckId implements Rule { /** * IDチェック * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { $id = Hoge::find((int)$value); if (!$id) return false; return true; } /** * エラーメッセージ * * @return string */ public function message() { return "IDが存在しません"; } } |
ちなみにRuleの中身はこんな感じ。
・Illuminate\Contracts\Validation\Rule.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php namespace Illuminate\Contracts\Validation; interface Rule { /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value); /** * Get the validation error message. * * @return string */ public function message(); } |
あとは以下のように追加すればカスタム完了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; ←追加 use App\Rules\CheckId; ←追加 class HogesRequest extends FormRequest { /** * @return bool */ public function authorize() { return true; } /** * バリデーションルール * * @return array */ public function rules() { return [ 'id' => [new CheckId], ←追加 'tel' => ['required', 'regex:/^[0-9\-]+$/i', 'max:14'], ... ]; /** * バリデーションメッセージ * * @return array */ public function messages() { return [ "required" => "入力してください", ... ]; } /** * カラム名 * * @return array カラム名 */ public function attributes(){ return [ 'id' => 'ID', 'tel' => '電話番号', ... ]; } } |
カスタムバリデーションを使うために以下を追記します。
1 2 | use Illuminate\Validation\Rule; use App\Rules\CheckId; |
そして使用するカスタムバリデーションのインスタンスを生成します。
1 | [new CheckId] |
Laravelのバリデーションを実行する方法
バリデーション定義が終わったら後は簡単。
登録や更新処理などでバリデートしたいリクエストに対して、コントローラのメソッドの引数に使用するバリデーションを追加するだけ。
viewからコントローラにリクエストをsubmitする際に勝手にバリデートしてくれます。
1 2 3 4 5 6 7 8 9 | use App\Http\Requests\HogesRequest; ... public function store(HogesRequest $request) { ... |
Laravelのバリデーションエラーをviewで表示する方法
viewにエラーメッセージを表示したい場合は、表示したい箇所で以下のように追加すればおけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ... @if($errors->has('id')) <pclass="error">{{ $errors->first('id') }}</p> @endif <label>ID</label> ... @if($errors->has('id')) <pclass="error">{{ $errors->first('tel') }}</p> @endif <label>電話番号</label> ... |
以上、laravelでカスタムバリデーションを実装する方法でした。