【Laravel】オリジナルバリデーションルールの作り方!make:ruleコマンド

この記事からわかること

  • Laravelオリジナルバリデーションルール作り方
  • make:ruleコマンドの詳細の作成されるファイル解説
  • エラーメッセージやルールのカスタマイズ

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelでオリジナルのバリデーションルールを作る方法と組み込み方をまとめていきたいと思います。

オリジナルバリデーションルールの作り方

独自のバリデーションルールを定義するにはLaravelに用意されているmake:ruleコマンドを使用します。

$ php artisan make:rule TestOriginalRule

これで「app」>「Rules」の中に指定したファイル名(今回はTestOriginalRule)のスクリプトファイルが自動生成されます。ファイルの中は以下のようにクラスが定義されています。

TestOriginalRule.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class TestOriginalRule implements Rule
{
    public function __construct()
    {
        //
    }

    public function passes($attribute, $value)
    {
        //
    }

    public function message()
    {
        return 'The validation error message.';
    }
}

ルールクラスの各メソッドの意味

作成されたクラスは名前空間Illuminate\Contracts\Validation\Ruleを継承したルールクラスになっており3つのメソッドがデフォルトで記述されています。

__construct

__constructはphpのクラス構造自体に元々定義されているインスタンス化した時に自動実行される処理を記述できるメソッドです。クラスのプロパティ(変数)に値を渡すなどインスタンス化時に初期化するための処理などして使用します。

バリデーションルール作成に重要なのはpassesメソッドとmessageメソッドです。

passesメソッドの役割

public function passes($attribute, $value)
{
    return 真偽値を返す;
}

passesメソッドはバリデーションルールのエラー判定を行うメソッドです。最終的に返す値でエラー判定を行い、trueにすれば合格、falseにすればエラーとしてはねることができます。

引数にはルール関係の設定属性を受け取る$attributeと実際に検証する値を受け取る$valueが渡されます。

messageメソッド

public function message()
{
    return 'これはエラーメッセージです。';
}

messageメソッドはxエラーとして弾いた時に出せるメッセージを定義Yesできるメソッドです。

メッセージの中に:attributeと組み込むと自動で指定したname属性の値へと置換されます。

 return ':attribute項目では許可されていません';

独自ルールを使用する

独自ルールを実際に使用するには使用するファイルでuse文を使ってルールクラスを読み込みます。

use App\Rules\TestOriginalRule;

続いてルールを作成する配列の中で適応させたいルールクラスをインスタンス化するだけです。これでオリジナルルールを使ったバリデーションができるようになります。

$request->validate([
    'name' => ['required', 'string', new TestOriginalRule],
]);

インスタンス化時に引数を渡す

ルールクラスを動的に変化させるために引数から値を渡すことも可能です。その際はルールクラスのコンストラクタを使用しクラスのプロパティへと値を渡します

例として「引数に渡された文字位置の値が.(ドット)のみ許容」という独自ルールを作成してみます。

作成コマンド

$ php artisan make:rule PosOnlyDot

PosOnlyDot.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class PosOnlyDot implements Rule
{

    public function __construct(int $num)
    {
      // インスタンス化時に渡された引数をプロパティに紐づける
        $this->num = $num;
    }

    public function passes($attribute, $value)
    {

        $pos = strpos($value, ".");
        if ($pos == $this->num) {
            return true;
        } else {
            return false;
        }
    }

    public function message()
    {
        return $this->num . '番目にはドットが来るように入力してください。';
    }
}

コンストラクタでプロパティに格納すれば他のメソッドの中からでもその値に参照することが可能になるのでその値による分岐や取得ができるようになります。

あとは通常のバリデーションルール同様に組み込むだけです。|区切りのルール定義ではなく、以下のような配列形式で独自ルールは渡します

Controller.phpなど

use App\Rules\PosOnlyDot;

$request->validate([
  'name' => ['required', new PosOnlyDot(6)],
]);

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index