Laravel 独自で用意するバリデーション

Laravelが用意したバリデーションじゃなくて完全に自前にする

作成日:2019-04-03, 更新日:2019-04-03

経緯

完全に主観です。

・単純なバリデーションしかしないなら問題無いけど、実際はそうじゃない。
・Laravelが用意したバリデーションにカスタムバリデーションを追加するとあちこちのファイルを修正しないといけないのが面倒

希望と妥協

・ことあるごとにconfigとかをいじるのがイヤだ
・ラクをしたい

ことあるごとにconfigとかをいじるのがイヤだ

・「app\」の下に適当なフォルダを作って、その中のファイルを呼び出せばOK
→「app\helpers」を作ってその中のファイルを呼び出す
※呼出し時にuseとか使えばもっとラクになるんだけど、useから追いかけるのが面倒なので「app\helpers\〇〇〇::〇〇〇()」で呼び出す。

ラクをしたい

・自前で用意するとなると諸々ルールを作らなくちゃいけない。
→面倒だけど、他のサイトへコピペできるから我慢する

・単純なエラーメッセージを用意する
→これも面倒。でも既存のヤツを状況に応じて考えなくちゃいけないなら、用意するほうがラク。

ファイル構成

・app\helpers\lib\validator.php - 継承元であり、他のサイトでも使える共通内容
・app\helpers\validator\common.php - サイト独自の内容
・app\helpers\validator\〇〇〇.php - 各ページごとのバリデーション
・コントローラー(app\Http\Controllers\〇〇〇.php)

app\helpers\lib\validator.php - 継承元であり、他のサイトでも使える共通内容

<?php
namespace App\Helpers\Lib;

class Validator {
  
  public static function fixResponse($aryIpt, $aryErr) {
    $result = array();
    
    if ( 0 < count($aryErr) ) {
      // エラー文のセット
      $result['validation'] = $aryErr;
    }
    
    if ( \Request::ajax() ) {
      // ajaxのときだけトークンを返す:必要無ければ削除
      $result['_token'] = csrf_token();
    }
    
    return $result;
  }
  
  /** 各ルール1 **/
  public static function 〇〇〇() {
    if ( 〇〇〇 ) {
      return true;
    }
    else {
      return false;
    }
  }
  
  /** 各ルール2 **/
  public static function 〇〇〇() {
    if ( 〇〇〇 ) {
      return true;
    }
    else {
      return false;
    }
  }
}

app\helpers\validator\common.php - サイト独自の内容

「ページA」と「ページB」で共通のバリデーションのような複数個所で使うルールを記載。

<?php
namespace App\Helpers\Validator;

class common extends \App\Helpers\lib\Validator {
  
  /** usernameのバリデーション **/
  public static function username($input, $key, $label='ユーザー名') {
    $err = '';
    
    // ▼「\App\Helpers\lib\Validator」でチェック
    if ( $err=='' && !self::〇〇〇() ) {
      $err = '何かエラーがあった';
    }
    
    if ( $err=='' && !self::〇〇〇() ) {
      $err = $label . 'は何かじゃないとダメ';
    }
    // ▲「\App\Helpers\lib\Validator」でチェック
    
    return $err;
  }
  
  /** passwordのバリデーション **/
  public static function password($input, $key, $label='パスワード') {
    $err = '';
    
    // ▼「\App\Helpers\lib\Validator」でチェック
    if ( $err=='' && !self::〇〇〇() ) {
      $err = $label . 'をご確認ください';
    }
    // ▲「\App\Helpers\lib\Validator」でチェック
    
    return $err;
  }
}

app\helpers\validator\〇〇〇.php - 各ページごとのバリデーション

コントローラーに書いてもいいんだけど、見づらくなるのでバリデーション部分だけページ単位で用意

<?php
namespace App\Helpers\Validator;

class 〇〇〇 extends \App\Helpers\Validator\Common {
  
  public static function chk() {
    $aryIpt = array(
      'username' => \Request::input('username', ''),
      'password' => \Request::input('password', ''),
    );
    
    $aryErr = array();
    
    // ================================
    // username:「\App\Helpers\Validator\Common」でチェック
    $tmpErr = self::username($aryIpt, 'username', 'ログインID');
    if ( $tmpErr != '' ) {
      $aryErr['username'] = $tmpErr;
    }
    
    // ================================
    // password:「\App\Helpers\Validator\Common」でチェック
    $tmpErr = self::password($aryIpt, 'password', 'パスワード');
    if ( $tmpErr != '' ) {
      $aryErr['password'] = $tmpErr;
    }
    
    return self::fixResponse($aryIpt, $aryErr);
  }
}

コントローラー(app\Http\Controllers\〇〇〇.php)からバリデーション

「app\helpers\validator\〇〇〇.php」でチェックさせる。

public function 〇〇〇() {
  $validator = \App\Helpers\validator\〇〇〇::chk();
  if ( array_key_exists('validation', $validator) ) {
    echo 'だめ!';
    exit;
  }
  else {
    // エラーなし
  }
}

関連項目

Laravel バリデーション