N_OR’s diary

無職が何か言ってる

laravelでのvalidation処理4(ルールの自作)

色々なValidationの実装を試してみる。
今回は自分でRuleクラスを作成してValidationの内容を実装する。

例としてユーザIDがユニークであるかをチェックするルールを作成。

ルールクラスを作成

ターミナルからルールクラスを作成するコマンド。

php artisan make:rule UserIdUniqueRule 

ruleクラスの実装

上記で作成されたファイル(クラス)の実装。
passesにチェックを通すための処理を記述。
modelを呼び出してDBから値を取得。取得した値とチェックする値を比較して判定する。
エラー時の文言はmessageに実装。

<?php

namespace App\Rules\;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Auth;
use App\Model\User;

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

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value(userId)
     * @return bool
     */
    public function passes($attribute, $value)
    {
        // IDがなし(新規)もしくは自分自身はチェック不要
        if ($value == null || $value == Auth::id()) {
            return true;
        }

        // ユーザが登録済みかのチェック
        $mUser = new User();
        $user = $mUser->getUserInfo($value);

        if ($user != null) {
            return false;
        }

        return true;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return '既に登録済みのIDです';
    }
}

Request側への実装

作成後、リクエストクラスのrulesに上記で作成したクラスを追加。 リクエストクラスは以前やりかた3で作成したものをイメージ。

    use App\Rules\UserIdUniqueRule; 

    public function rules() 
    { 
        return 
            // チェック内容 
            [ 
                'id' => ['required', new UserIdUniqueRule()], 
                'name' => 'required', 
                'email' => 'required', 
            ]; 
    } 

以上。

余談1

Ruleクラスを作成するやり方以外にサービスプロバイダを使用する方法もあるが、個人的にしっくりこないので、そういったやり方が存在することだけ覚えて内容は割愛。

余談2

Rule専用のディレクトリが用意されることになるが、自作しなきゃならないようなチェックはなんらかの業務的な要件がほとんどであり、そういったチェックは業務処理の近くにあった方がわかりやすい気がする。
そんなことない?
自分が業務処理は共通化しない方針なのでこういった感想になるのかしら。
とりあえず作られたままに利用します。

余談3

ここまで何となくlaravelを触っていての感想。
基本的にModel本体ではエラーチェックはしないので、Modelを使う場合は今回の様にどこかしらでチェック済された、正しい値が入っていることを期待することになる。

ちなみに、今回の作りだと、参照は
 Control→Request(Validator)→Rule→Model
となりModelのためのチェックはされていない。
もし更新処理する場合は気をつけたほうが良さそう。するシチュエーションがあるかは知らない。