もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのFormRequestで独自ルールの作成

こんばんは。

最近ずっとlaravelしてます。

だいぶやり方忘れています。

今回はバリデーションの独自ルールの作成のやり方を備忘録で残しておきます。

バージョンは以下

# php -v
PHP 7.4.26 (cli)

 # php artisan -V
Laravel Framework 8.83.0

本題

コマンド的には以下で作れます。

# php artisan make:rule TestRule
Rule created successfully.

作成されたRuleクラスは以下です。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class TestRule 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.';
    }
}

ようするに Illuminate\Contracts\Validation\Rule Interfaceをimplementsしたクラスを作ればいいって感じです。

使う側はこんな感じ

    public function rules(): array
    {
        return [
            'item_id'  => ['required', 'integer', new TestRule()],
        ];
    }

独自ルールになんらかをコンストラクタインジェクションしたいときとかは以下

    public function rules(): array
    {
        return [
            'item_id'  => ['required', 'integer', $this->container->get(TestRule::class)],
        ];
    }

ある程度の形だったら FormRequestには prepareForValidation() とかあるからバリデーション前に 展開して 確認とかもできちゃうから なかなか新規では作らなそうなイメージですが、ある特殊なフォーマットで正規表現して確認したいとか、API通信して存在確認したいとか、そんな感じが多いかなと思います。

いろんな機能があっておもしろいっすね。

終わりに

地獄の2月が終わったので、今月は少し楽になりますww

来週からはちゃんと本読んで勉強しようと思います。