10
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【laravel】validateメソッドによるバリデーション

Last updated at Posted at 2020-05-04

概要

laravelではいくつかの方法でバリデーションをかけることができます。
そのため一度に投稿するとボリュームが多くなるので複数回に分けます。

・Validatorによるバリデーション
・FormRequestによるバリデーション
・ruleオブジェクトによる検証ルールの追加
・バリデーションエラーの表示と日本語化

validateクラスとは

validateメソッドはControllerクラスに組み込まれているIlluminate\Http\Requestオブジェクトのメソッドを使います。
validateメソッドでは、POSTされた値のバリデーションに成功するとコードは通常通り続けて実行され、バリデーションに失敗すると自動的に例外が投げられてユーザーにエラーメッセージが返されるため手軽にバリデーションを実行できます。

コントローラーとルーティングの作成

例としてFormControllerでバリデーションのコードを記述するため、コントローラーとルーティングを作成します。

ルートの定義

FormControllerクラスのpostValidatesメソッドへのルーティングを記述します。

web
Route::post('sample', 'FormController@postValidates');

コントローラーの作成

バリデーションを実行するFormControllerクラスを作成します。
Controllerの作成なので段落だけ付けて詳細は割愛します。

コマンド

コマンド
php artisan make:controller FormController

ディレクトリ構造

ディレクトリ
app
├─ Http
|  ├─ Controllers
|  |  ├─ FormController.php

作成されるファイル

FormController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FormController extends Controller
{
    //
}

バリデーションの作成

作成したFormControllerにpostValidatesというメソッドを作成してバリデーションの処理を記述していきます。
(ここのメソッド名はなんでもいいです。)

FormController
public function postValidates(Request $request)
{
 //
}

バリデーションの記述

validateメソッドは$request->validate(['検証の配列'])または$this->validate($request,[検証の配列]);で作成します。
reurnはバリデーションが成功した際にビューで出力する値です。
記述例は載せますが解説は前者で統一します。

FormController
public function postValidates(Request $request)
{
  $request->validate([
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ];)
  return view('sample.index',['msg'=>'OK']);}
}

// 記述方法:$request->validate(['検証の配列']);
FormController
public function postValidates(Request $request)
{
  $validate_rule = [
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ];
  $this->validate($request,$validate_rule);
  return view('sample.index',['msg'=>'OK']);
}

// 記述方法:$this->validate($request,[検証の配列]);

validateメソッドの配列

連想配列で['postしてきた値'=>'検証ルール']となっています。
検証ルールを複数設けたい場合は検証ルールの間に|を入れて区切ります。
もしくは、配列のバリュー(検証ルール)を配列にして,で区切って記述することもできます。

FormController
$request->validate([
  'name' => 'required',
  'age' => 'integer | between:0,150',
  'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
];)
// 記述方法:['検証する値'=>'検証ルール1 | 検証ルール2',]
// もしくは、['検証する値'=>['検証ルール1', '検証ルール2'],]
使用した検証ルール
required:何かしらの値があること
integer:半角整数であること
between:a,b:aからbまでの数字
max:a:文字数の最大値がa個
regex::PHPのpreg_match関数

エラーメッセージのカスタマイズ

エラーメッセージをカスタマイズするには、第2引数にエラーメッセージを記述します。
ただし、エラーメッセージは検証ルールごとに設定する必要があるため、エラーメッセージの設定がない検証ルールはデフォルトのエラーメッセージが返されます。

FormController
public function postValidates(Request $request)
{
  $request->validate([
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ],
  [
    'name.required' => '名前を入力してください',
    'age.numeric' => '整数で入力してください',
    'age.between' => '0~150で入力してください'
    'sex.regex' => '男か女で入力してください',
  ]);
  return view('sample.index',['msg'=>'OK']);}
}
表示例
name(required):名前を入力してください
age(integer):整数で入力してください
age(between):0~150で入力してください
sex(max:1):The sex may not be greater than 1 characters.
sex(regex:/^[男|女]+$/u):男か女で入力してください

参考

[
Laravel 6.x バリデーション]
(https://readouble.com/laravel/6.x/ja/validation.html)
[Laravelのvalidationメソッドでバリデーションを実装する入門編]
(https://www.ritolab.com/entry/40)
[入門者のためのLaravelのValidationとエラーメッセージ]
(https://reffect.co.jp/laravel/laravel_validation_understanding)
[はじめてLaravel6.0:バリデーション追加&カスタムバリデーション/入力画面(2)]
(https://arakan-pgm-ai.hatenablog.com/entry/2019/10/30/000000)
[【保存版】バリデーションルールまとめ]
(https://www.wakuwakubank.com/posts/376-laravel-validation/)

10
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?