22
18

More than 3 years have passed since last update.

Laravelで独自のバリデーションを定義する

Posted at

カスタムバリデーションを登録する方法

大きくわけて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],
        ];
    }
22
18
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
22
18