Laravelでカスタムバリデーションのルールを作成する
いくつか方法はあるけど個人的にはRuleファイルを生やすのが良いと思うので,このページもそれで書く
カスタムバリデーションを行う際はRuleクラスを作成した方が良いと思う理由
テストがしやすい
バリデーション単体のテストを行いやすい
バリデーションルールを使い回せる
Closureを何回もコピペするのは大変
Ruleクラスを作ればnew ExampleRule()で済む
ルールクラスの作り方
artisanのmakeコマンドで作成する
$ php artisan make:rule CommentRule
app/Rules/CommentRule.phpが生成される
\Illuminate\Contracts\Validation\Ruleを実装したクラス
passes()とmessage()を実装する
passes()はboolを返す
バリデーションを実装する
バリデーション通過ならtrue,エラーならfalseを返す
message()はstringかarrayを返す
エラーメッセージの内容
言語ファイルにエラーメッセージを書く
code:app/Rules/CommentRule.php
public function message()
{
return trans('validation.comment');
}
code:resources/lang/ja/validation.php
return [
// 省略
'comment' => ':attributeは有効なコメント形式ではありません。',
];
必要に応じてコンストラクタを実装する
依存する物があるならコンストラクタで注入するのが良いと思う
使い方
バリデーションルールの配列でnew CommentRule()する
code:StoreCommentRequest.php
class StoreCommentRequest extends FormRequest
{
// 省略
public function rules()
{
return [
];
}
}
stringで書いて"|"で繋げて書きたい場合は,バリデーターにルールを登録する必要がある
バリデーターにルールを登録する場合
Validator::extend()でルールを追加するとstringでルールを書けるようになる
読みにくいし,配列で定義する必要がある場合に書き換えるのが面倒だしやらない方が良いと思う
サービスプロバイダーで登録する
code:app/Providers/AppServiceProvider.php
public function boot()
{
\Validator::extend('comment', CommentRule::class.'@presss');
}
こうするとnew CommentRule()をする必要がなくなる
['required', 'comment']とか'required|comment'みたいに書ける
バリデーターにルールを登録するかしないか
個人的にはしない方が良いと思う
理由としては全部文字列だと,Laravel標準のルールとカスタムルールの差が分かりにくいから
Laravel標準のルールは文字列で書いて,分からなければLaravelのドキュメントを読む
カスタムルールはクラスで書いて,分からなければプロジェクトのドキュメントやルールのクラスを読む
みたいな運用が良いと思うので