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());
}