カスタムバリデーションを登録する方法
大きくわけて3パターン
- 1回しか使わない
- クロージャー
- 頻繁には使わないけど、ある部分で必要
- ルールオブジェクト
- サイト全体で共通のものとして使いたい
- Validatorを拡張する
ルールオブジェクトとValidatorを拡張するパターンの明確な使い分けがよくわかってない。
ルールオブジェクトの場合はnewで都度呼び出さないといけないので、使用する頻度で分ければ良い?
毎回必要なものでなければルールオブジェクト
頻繁に使うものはValidatorを拡張する
今回はValidatorを使った方法を記載する。
実装
サービスプロバイダーを作成する
php artisan make:provider ValidatorServiceProvider
サービスプロバイダーを登録する
config/app.php
/*
* Application Service Providers...
*/
App\Providers\ValidatorServiceProvider::class,
処理を書く
App\Providers\ValidatorServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Validator;
class ValidatorServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
/**
* 郵便番号 ハイフンありなしのバリデーション
*
* @return bool
*/
Validator::extend(
'zipcode',
function ($attribute, $value, $parameters, $validator) {
return preg_match('/^[0-9]{3}-?[0-9]{4}$/', $value);
}
);
}
}
以上で準備完了。
後はformRequest側で呼び出してあげるだけ
formRequest.php
public function rules(): array
{
return [
'zipcode' => 'zipcode',
];
}
バリデーションメッセージを日本語にする場合は言語ファイルに設定しよう。
resource/lang/ja/validation.php
//エラーメッセージ
'zipcode' => ':attributeは郵便番号の形式では入力してください'
//属性
'attributes' => [
'zipcode' => '郵便番号'
],
ルールオブジェクトを使う場合
ルールオブジェクトの作成
php artisan make:rule ZipCodeRule
App/Rules/ZipCodeRule.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ZipCodeRule implements Rule
{
/**
* バリデーションの成功を判定
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('/^[0-9]{3}-?[0-9]{4}$/', $value);
}
/**
* バリデーションエラーメッセージの取得
*
* @return string
*/
public function message()
{
// return 'validation.zipcode';
//翻訳ファイルからメッセージを取得する場合
return ':attributeは郵便番号の形式では入力してください';
}
}
formRequest側で呼び出す時はこんな感じ。
配列にして書かないといけないので注意。
formRequest.php
public function rules(): array
{
return [
'zipcode' => ['required', new ZipCodeRule],
];
}