Laravelのバリデーションに関するメモ書き。
特に、バリデーションをコントローラ以外に書いていく方法について
コントローラに記述する方法については、下記記事で紹介しているので、参考に。
最初に結論を言うと、下記の4つの方法を本記事では紹介する。
- フォームリクエストを使用してバリデーション
- バリデータを作成してバリデーション
- オリジナルバリデータの作成
- Validator::extend を使用してバリデーション
順に紹介していく。
①フォームリクエストを使用してバリデーション
コントローラからバリデーションを切り離す代表的な機能として、
「フォームリクエスト」というものがある。

フォームリクエストは、リクエストをフォーム利用のために拡張したもの。
クライアントからのリクエストをインスタンスとして扱うための、Requestクラスを継承して作成されており、バリデーション機能が組み込まれている。
これにより、コントローラからバリデーションを切り離して、バリデーションを実行することが可能。
フォームリクエストの作成
フォームリクエストの作成は下記。
php artisan make:request ◯◯Request
◯◯は任意
フォームリクエストが作成される場所
フォームリクエストは下記に作成される。
app→Http→Request
フォームリクエストの使い方
使い方を説明する前に、フォームリクエストの初期状態を確認しておいてもらいたい。
HelloRequestという名前で作成した場合の例、下記のような初期状態になる。
authorizeメソッドと、rulesメソッドの二つが用意されている。
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HelloRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
上記を踏まえ、フォームリクエストの使い方を簡単に説明すると、下記のような手順になる。
- フォームリクエストを使用したいアクションの引数$requestのクラスを修正する
- authorizeメソッドが呼び出され、フォームリクエストの使用許可、または不許可の結果が返される
- ②の結果が許可なら、rulesメソッドが呼ばれ、バリデーションが実行される
順に手順を説明していく。
①フォームリクエストを使用したいアクションの引数$requestのクラスを修正する
作成したフォームリクエストを呼び出すために、まず初めに、
作成したフォームリクエストを使用したいアクションの引数を修正する。
以下は「HelloRequest」というフォームリクエストを使用する場合の例。
public function post(HelloRequest $request) //HelloRequestの$requestになっている
{
return view('hello.index, ['msg'=>'OK!']);
}
引数を、HelloRequestクラスの$requestに修正する。
これで、アクションが呼ばれる時、アクション実行の前に、クライアントからのリクエスト内容をフォームリクエストでバリデーションすることが可能となる。
②authorizeメソッドが呼び出され、フォームリクエストの使用許可、または不許可の結果が返される
①によってフォームリクエストが呼び出されると、初めにauthorizeメソッドが呼び出される。
authorizeメソッドは、フォームリクエストの使用許可、不許可を返すメソッド。
trueを返せば許可、falseを返せば不許可となる。
- return true → 許可
- return false → 不許可
# authorizeメソッドの編集例
class HelloRequest extends FormRequest
{
public function authorize()
{
if ($this->path() == 'hello')
{
return true; //許可
} else {
return false; //不許可
}
}
FormRequestは、クライアントからのリクエスト情報をインスタンスとして扱うRequestクラスを継承しているため、「$this」からリクエストの情報を取得することが可能。
取得したリクエストの内容を元に、バリデーション実行対象として許可・不許可を判断する。
③ ②の結果が許可なら、rulesメソッドが呼ばれ、バリデーションが実行される
②authorizeメソッドの結果が許可(true)であれば、次にrulesメソッドが呼び出される。
rulesメソッドは、適用されるバリデーションの検証ルールを返すメソッド
public function rules()
{
return [
'name' => 'requied',
'mail' => 'email',
'age' => 'numeric|between:0,150',
];
}
上記では項目、「name」「mail」「age」について、バリデーションが適用されるルールが設定されている。
フォームリクエストまとめ

ちょっと長くなったので、フォームリクエストを使ったバリデーションについて簡単に流れをまとめた。
- コマンドでフォームリクエストを作成
- アクションの引数(リクエストインスタンス)を呼び出すフォームリクエストのクラスに修正
- アクションを呼び出す再に、フォームリクエストが呼び出される
②バリデータを作成してバリデーション
次に、バリデータを作成してバリデーションする方法を紹介する。
バリデータとは
コントローラのvalidateメソッドを使わずに、
Validatorクラスのインスタンスを作成してバリデーション処理する機能。
これにより、バリデーションエラー時に、フォーム元にリダイレクトせず、
別の処理を実行するといった、カスタマイズ処理の実行が可能になる。
バリデータの利用
Validatorクラスのインスタンスを作成するには、
アクション内に次のルールで作成する。
$validator = Validator::make( 値の配列, ルールの配列 );
- (第一引数)値の配列→チェックする値の配列。フォームで送られてくる値。
- (第二引数)ルールの配列→バリデーションのルール
実行結果によって作成されたインスタンス($validator)には、
バリデーションの結果が格納されているので、それを元に、
後続でカスタマイズ処理を記述していく。
クエリ文字列のバリデーション
Validatorインスタンス作成の際、
第一引数を下記のように変更することで、クエリ文字列をバリデーションすることができる。
$validator = Validator::make($request->query(),[ //引数に注目
//バリデーションルールを記載
}
引数を、$request->query()とすることで、
フォームではなく、クエリ文字列でパラメータが渡ってきた場合にバリデーション可能。
バリデーションルールの書き方は「キー=>ルール」で変わらない
必要に応じてルールを追加する「sometimes」
Validatorクラスの、「sometimes」メソッドを使うことで、
項目ごとにルールを細かく追加することができる。
$validator->sometimes( 項目名, ルール名, クロージャ);
クロージャの結果がfalseだった場合に、
指定した項目名に、指定したバリデーションルールが追加される。
trueの場合は何もしない。
以下例
!is_int($input->age)の結果が、falseだった場合に、
ageに対して、min:0のルールでバリデーションがかけられる
$validator->sometimes( 'age', 'min:0', function($input) {
rerurn !is_int($input->age);
});
ちょっと難しいので、詳しい使い方に関しては下記
③オリジナルバリデータの作成
次にオリジナルバリデータを作成してバリデーションする方法を紹介する。
オリジナルバリデータとは
独自のバリデーションルールのこと。
もともとあるバリデーション以外のルールで、
バリデーションを行いたいときに使う。
オリジナルバリデータの使いかた
オリジナルバリデータを使うには、バリデータそのものを作ってしまう。Illuminate\Validation\Validatorクラスを継承したクラスを作成する。
作成する場所にとくに決まりはないのでHttp以下にでも作る。
use Illuminate\Validation\Validator;
class クラス名 extends Validator
{
public function validate〇〇($attribute, $value, $parameters)
{
//バリデーション処理
return 真偽値;
}
}
〇〇の部分は、バリデーションのルール名になるので注意。
validateHello → ‘hello’というルール名で認識される
- 引数1、、属性
- 引数2、、チェックする値
- 引数3、、ルールに渡されるパラメータ
オリジナルバリデータを組み込む
オリジナルバリデータを組み込むには、サービスプロバイダを使用する。
その中の、とくにbootメソッドを修正していく
オリジナルバリデータを、
「app→Http→Validators(自分で作成)→HelloValidator.php」として作成した場合、
下記のようにHelloServiceProvider.phpを修正
// use Validator;
// use App\Http\Validators\HelloValidator;
public function boot() {
$validator = $this->app['validator];
$validator->resolver(function($translator, $data, $rules, $message) {
return new HelloValidator($translator, $data, $rules, $message);
});
}
正直この書き方の詳細はよくわからなかったので、
とりあえず「オリジナルバリデータは、サービスプロバイダのbootで呼び出すんだな」
という理解まで、、
また調べたら、リライトしたいと思う。
④Validator::extend を使用してバリデーション
バリデーションクラスを作るほどしっかりしたバリデーションではなかったり、
特定のアクション内でだけ実行したい汎用性ゼロのバリデーションの場合には、
Validator::extendを使ってバリデーションをする。
同じくbootメソッド内で組み込む
//書式
Validator::extend( 名前, クロージャ );
第二引数のクロージャの書き方
function($attribute, $value, $parameters, $validator)
{
//バリデーション処理
return 真偽値;
}
バリデーションクラスのvalidate〇〇メソッドと似ているが、4つ目の引数にバリデータインスタンスを渡す。
上記ができたらbootメソッドに組み込む
public function boot()
{
Validator::extends('hello', function($attribute, $value, $parameters, $validator) {
return $value % 2 == 0;
});
}
これで「hello」というルール名が追加された。
ちょっとした簡単なバリデーションは上記のようにすると楽。
コントローラに記述する方法については、下記記事で紹介しているので、参考に。
https://readouble.com/laravel/8.x/ja/validation.html