Laravel バリデーション
作成日:2018-12-05, 更新日:2019-04-03
基本
バリデーションのときの挙動が色々とあって・・・結構面倒(バージョンの絡みもあるし・・・)
→最終的には自前で用意したほうが早いような気がする(※結局はチェックしてエラーを返せばいいだけだし・・・)
▼バリデーションのチェックでエラーが出たときの挙動
・即リダイレクト(趣味じゃないし、個人的に予定が無いので未調査)
・手動でリダイレクト
・リダイレクトさせない
どの方法を選ぼうが下記の3つが絡んでくる。
・対象のデータ($request)
・バリデーションのルールの設定
・エラー時のメッセージの設定
▼「手動でリダイレクト」させる場合
$validator = \Validator::make(データ, ルール); if ($validator->fails()) { return redirect(リダイレクト先) ->withErrors($validator) ->withInput(); }
▼「エラーを出力」させる場合
$validator = \Validator::make(データ, ルール); if ($validator->fails()) { // 別のトコで設定したエラーメッセージを出力 var_dump($validator->errors()); }
「\Validator::make()」の第3引数でエラーメッセージを設定できる→後述。
対象のデータ($request)
▼コントローラーで引数で受取る場合
public function 〇〇〇(Request $request) {}
▼コントローラーの中でゴニョゴニョする場合
public function 〇〇〇() { // マルっと取得 $iptAll = \Request::all(); // ひとつずつ設定 //$ipt = array( // '〇〇〇' => \Request::input(〇〇〇), // '〇〇〇' => \Request::input(〇〇〇), //); }
バリデーションのルールの設定
・配列で設定
・複数のルールは「|」で区切る
・パラメータは「:」で区切る(複数あるなら「,」)
▼ルール
// こんな感じのデータが来たときのルール // <input name="hoge1"> // <input name="hoge2"> // <input name="hoge3"> // <input name="hoge4"> $rule = array( 'hoge1' => 'required', // ルールが一つしかないとき 'hoge2' => 'required|alpha_num', // ルールが複数あるとき「|」で区切る 'hoge3' => 'max:10', // パラメータがあるとき「:」で追加する 'hoge4' => 'between:2,3', // パラメータが複数あるとき「,」で区切る );
※ルールの内容は「公式:Laravel5.7 / available validation rules」を参照
エラー時のメッセージの設定
・「resources\lang\en\validation.php」を修正する
・日本語にしたいなら「resources\lang\ja」に用意して「config\app.php」の「locale」「fallback_locale」を「ja」に設定
・もしくは都度設定する(カスタムバリデーションを使う)
カスタムバリデーション
単純なバリデーションチェックの組合せを使うためにアレコレ考え、調べるなら「都度作った方が早くない?」という気がする。
→複数人でやる場合、都度作ると面倒になコトになるからフレームワークを使おうって話なのは分かるんだけどね・・・
基本方針
・「エラーは都度設定」という方針でいく
※「\Validator::make()」の第3引数でエラーメッセージを設定
初回(カスタムバリデーションの準備)
▼下記3つを作成 or 修正
・app\Validator\CustomValidator.php
・app\Providers\ValidatorServiceProvider.php
・config\app.php
app\Validator\CustomValidator.php
独自のルールを設定するファイル
▼新規作成(フォルダが無ければフォルダごと作成)
<?php namespace App\Validator; class CustomValidator extends \Illuminate\Validation\Validator { public function 〇〇〇($attribute, $value, $parameters) { if ( 条件 ) { // エラーじゃないとき return true; } else { // エラーのとき return false; } } }
app\Providers\ValidatorServiceProvider.php
設定したルール(app\Validator\CustomValidator.php)を使える(?)ようにするファイル
▼新規作成
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Validator\CustomValidator; class ValidatorServiceProvider extends ServiceProvider { public function boot() { \Validator::resolver(function ($translator, $data, $rules, $messages, $attributes) { return new CustomValidator($translator, $data, $rules, $messages, $attributes); }); } /** registerメソッドは必ず実装しておく必要アリ */ public function register(){} }
config\app.php
ValidatorServiceProvider.phpを読み込ませる
▼追加
~ 省略 ~ providers' => [ ~ 省略 ~ 'App\Providers\ValidatorServiceProvider', ], ~ 省略 ~
カスタムバリデーションを使う
▼カスタムバリデーション(app\Validator\CustomValidator.php)
public function hoge1($attribute, $value, $parameters) { if ( 条件 ) { return true; } else { return false; } } public function hoge2($attribute, $value, $parameters) { if ( 条件 ) { return true; } else { return false; } }
▼コントローラー
// 入力された値 $input = \Request::all(); // ルール:「app\Validator\CustomValidator.php」の「hoge1()」「hoge2()」を実行 $valid_rule = array( '〇〇' => 'hoge1', '〇〇' => 'hoge2', ); // エラーメッセージ:「app\Validator\CustomValidator.php」の「hoge1()」「hoge2()」が「false」のとき $valid_mess = array( 'hoge1' => '〇〇〇を確認してください', 'hoge2' => '〇〇〇は〇〇じゃないとダメです', ); $validator = \Validator::make($input, $valid_rule, $valid_mess); if ($validator->fails()) { var_dump($validator->errors()); }