【Laravel】丸ごとコピーして使える法人番号のバリデーション

プログラミング

 法人番号のチェックを行うプログラムは様々なサイトに記載されていましたが、Laravelのバリデーションルールの作成方法を記載した記事がなかったので、記載することにしました。

ここで紹介するのは法人番号のバリデーションの作成方法ですが、その他のオリジナルのバリデーションルールを作成するのにも役に立ちます。

この記事でできること
  • デフォルトのバリデーションルールと同じように使える、オリジナルのバリデーションルールを作成できる。
  • 法人番号のバリデーションルールを作成できる。
    public function rules()
    {
        return [
            // 「jcn」がオリジナルのバリデーションルール
            'houjin_bangou' => ['required','digits:13','bail','jcn'], 
        ];
    }
    public function messages()
    {
        return [
            'houjin_bangou.jcn' => ':attributeの入力値に誤りがあります。',
        ];
    }
スポンサーリンク

バリデーションルールクラスを作成する

ルールクラスのひな型を作成する

 オリジナルのバリデーションルールのクラスファイルは、app/Rules配下に作成します。
クラスファイルのひな型は、下記のコマンドで作成します。

> php artisan make:rule Jcn
※「Jcn」はクラス名です。好きな名前を指定することができます。

 ひな形の作成が成功すると、app/Rules配下に以下のファイルが作成されます。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Jcn implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

このファイルに、オリジナルのバリデーションルールを記載していきます。

バリデーションルールを記載する

 法人番号の仕様に基づいて、バリデーションルールを記載します。
バリデーションのOK・NGの判定ロジックは、passes()メソッドに記載します。

    public function passes($attribute, $value)
    {
        return 
            preg_match('/^[1-9][0-9]{12}$/',$value) &&   // 1~9で始まる13桁の数字
            $this->Error_judgment_by_check_digit($value) // チェックディジットによる判定(後述)
        ;
    }
    private function Error_judgment_by_check_digit($value)
    {
        // 最初の1桁目が検査用数字(チェックディジット)
        $check_digit = substr($value,0,1) ;   

        // 最初の1桁目を除く12桁の番号が基礎番号
        $basic_number = substr($value,1,12) ; 

        $sum_even_digit = 0;  // 最下位から偶数桁の和
        $sum_odd_digit = 0;   // 最下位から奇数桁の和

        for ($i = 1 ; $i <= 12 ; $i++)
        {
            // 最下位から{$i}桁目の数字
            $digit = substr($basic_number, - $i , 1) ; 

            if ($i % 2 == 0) {
                // 最下位から偶数桁の和
                $sum_even_digit += $digit; 
            } else {
                // 最下位から奇数桁の和
                $sum_odd_digit += $digit ;
            }
        }

        // 基礎番号から算出したチェックディジット
        $calculeated_check_digit = 9 - (($sum_even_digit * 2 + $sum_odd_digit) % 9) ; 

        // 「検査用数字=基礎番号から算出したチェックディジット」であれば正しい
        return ($check_digit == $calculeated_check_digit) ;

    }

 チェックディジットの判定は少々複雑なので、ここでは関数を作成しましたが、passes()内に直接記載しても動作に影響はありません。

バリデーションエラー時のメッセージを記載する

 バリデーションエラー時のメッセージは、message()に記載します。

    public function message()
    {
        return ':attributeに誤りがあります。番号が正しいかご確認ください。';
    }

 ちなみに、message()を下記のように記載することで、言語別のエラーメッセージを表示させることができます。(※使用言語は、config/app.php のlocaleで設定します)

    public function message()
    {
        return trans('validation.jcn');
    }

 表示するエラーメッセージは、resources/lang/{locale}/validation.phpに記載します。

return [
    'jcn'                  => ':attributeに誤りがあります。番号が正しいかご確認ください。',

デフォルトのバリデーションルール同様に使えるようにする

 以上の設定を行うと、作成したバリデーションルールクラスを利用することができます。
例えば、FormRequestクラスのrules()に以下のように記載することで、法人番号によるバリデーションを行うことができます。

use App\Rules\Jcn; // 作成したルールをuseする。

    public function rules()
    {
        return [
            'houjin_bangou' => ['required','digits:13','bail',new Jcn], // 「new Jcn」でルールを適用する。
        ];
    }

 しかしこの方法だと、「required」「digits:」のようなデフォルトのバリデーションルールのように、messages()でバリデーションエラーメッセージをカスタマイズすることができません

 そこで、サービスプロバイダを利用してバリデータの拡張を行い、バリデーションルールを追加します。

サービスプロバイダクラスのひな型を作成する

 オリジナルのサービスプロバイダのクラスファイルは、app/Providers配下に作成します。
クラスファイルのひな型は、バリデーションルール同様「php artisan」を使用します。

> php artisan make:provider ValidationServiceProvider
※「ValidationServiceProvider」はクラス名です。好きな名前を指定することができます。

 ひな形の作成が成功すると、app/Providers配下に以下のファイルが作成されます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidationServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}


 このファイルを使ってバリデータを拡張し、法人番号のバリデーションルールをデフォルトのバリデーションルール同じように使用できるようにします。

bootメソッドにバリデーションのルール追加(バリデータの拡張)を記載する

 サービスプロバイダのbootメソッドは、全サービスプロバイダの登録後に呼び出されるメソッドです。このbootメソッドに、バリデータの拡張を記載します。

use Illuminate\Support\Facades\Validator;

    public function boot()
    {
        Validator::extend('jcn', 'App\Rules\Jcn@passes');
    }

作成したサービスプロバイダを追加する

 作成したサービスプロバイダを、config/app.phpに記載します。

    'providers' => [
        Illuminate\View\ViewServiceProvider::class,

完成

 以上の設定を行うことで、法人番号のバリデーションルールはデフォルトのバリデーションルールと同じ記載方法で利用できるようになります。

    public function rules()
    {
        return [
            'houjin_bangou' => ['required','digits:13','bail','jcn'],
        ];
    }
    public function messages()
    {
        return [
            'houjin_bangou.jcn' => ':attributeの入力値に誤りがあります。',
        ];
    }


ちなみに

 オリジナルのバリデーションルールを実装するにあたって、既存のバリデーションルールを活用したい場合は、Validatorファザードを使用することで実現できます。

use Illuminate\Support\Facades\Validator;

    public function passes($attribute, $value)
    {
        $validator = Validator::make([$attribute => $value], [
            $attribute => [
                'digits:13',       // 13桁の数字
                'regex:/^[1-9]/'], // 1~9で始まる
        ]) ;

        return 
            (! $validator->fails()) && 
            $this->Error_judgment_by_check_digit($value) // チェックディジットによる判定
        ;
    }

以上、参考になればうれしいです。

コメント

タイトルとURLをコピーしました