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

公式

公式:Laravel5.7 / available validation rules