Laravel Validation

フォームリクエスト

生成コマンド

php artisan make:request TestRequest

Validation

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class TestRequest extends FormRequest
{
 public function authorize()
 {
  return true;
 }

 public function rules()
 {
  return [
   ’column1′ => ‘required | array’,
   ’column2′ => ‘required | integer’,
  ];
 }

 public function messages()
 {
  return [];
 }

 public function attributes()
 {
  return [
   ’column1′ => ‘〜’,
   ’column2′ => ‘〜’,
  ];
 }
}

使用

namespace App\Http\Controllers;

use App\Http\Requests\TestRequest;

class TestController extends Controller
{
 public function test(TestRequest $request)
 {
  〜
 }
}

バリデータ

Validation

namespace App\Rules;

use Illuminate\Support\Facades\Validator;

trait TestValidation
{
 protected function checkTest(Request $request)
 {
  $validator = Validator::make($request->all(),
   [
    ’column’ => [‘max:255′],
   ],
   [
    ’column.max’ => ‘E999’,
   ]
  );
  
  失敗時
  if ($validator->fails()) {
   エラーコード取得
   $codes = $validator->errors()->all(); 
   
   return $codes;
  }

  成功時
  return true;
 }
}

呼び出し

class TestController extends Controller
{
 use \App\Rules\TestValidation;

 public function test(Request $request)
 {
  $result = $this->checkTest($request);
 }
}

返却

$validator->errors()->add(‘field’, ‘メッセージ’);
throw new ValidationException($validator);
または
throw ValidationException::withMessages([‘field’ => ‘メッセージ’]);

ルール

一覧

パラメータparamの値が1の時に必須

ルール 機能 備考
required 必須
required_if:param,1 条件必須
nullable 未設定許可
integer 数値
string 文字列
array 配列
email Eメール
digits:3 3桁の数値
digits_between:1,5 1〜5桁の数値
regex:/^\+[0-9]{12}$/ 正規表現
exists:users,id usersテーブルにIDが存在する 複雑な条件でのexists
WHERE句を用いた問い合わせを用いたルール」参照
unique:users,phone usersテーブルでphoneが重複しない
実際にはこの書き方では正常に動作しない。現在レコードの除外が必要
Rule::unique('users', 'phone')
->ignore(Auth::user()->id, 'id'),
min:6 最小桁
max:255 最大桁
size:10 指定の値(10)と一致するか
gt:別フィールド名 指定の別フィールドより大きいか 時間は使えない
gte:別フィールド名 指定の別フィールドより同じか大きいか 時間は使えない
lt:別フィールド名 指定の別フィールドより小さいか 時間は使えない
lte:別フィールド名 指定の別フィールドより同じか小さいか 時間は使えない
before:別フィールド名 指定の別フィールドより前か 時間に使える
before_or_equal:別フィールド名 指定の別フィールドより同じか前か 時間に使える
after:別フィールド名 指定の別フィールドより後か 時間に使える
after_or_equal:別フィールド名 指定の別フィールドより同じか後か 時間に使える
in:0,1,A,B 0,1,A,Bのいずれか Rule::in([0,1,A,B])
not_in:0,1,A,B 0,1,A,Bでない
date_format:Y-m-d 日時フォーマット
date_format:Y-m-d H:i:s 日時フォーマット
bail エラー時に以後のバリデーションを実行しない 複数ルール設定時
複数

public function rules()
{
 return [
  ’column1′ => ‘required | array’,
  ’column2′ => [
   ’required’,
   ’integer’,
  ],
 ];
}

独自ルール

Rule::exists

use Illuminate\Validation\Rule;

public function rules()
{
 return [
  ’column3′ => [
   ‘exists:users,id’にwhere句を追加
   Rule::exists(‘users’, ‘id’)->where(function ($query) {
    $query->where(‘col1’, 1)
     ->whereNull(‘col2’);
   }),
  ],
 ];
}

Rule::requiredIf

use Illuminate\Validation\Rule;

public function rules()
{
 return [
  ’column4′ => [
   Rule::requiredIf(function () use ($input) {
    return $input[‘status’] === ‘A’;
   }),
  ],
 ];
}

独自関数
配列

public function rules()
{
 return [
  ’columns’ => [
   'string',
   function ($attribute, $value, $fail) {
    if ($value !== 'abcde') {
     $fail("$attribute must be abcde");
    }
   },
  ],
 ];
}

 
 
Laravel

前の記事

Laravel Migration/Seed
Laravel

次の記事

Laravel PHPUnit