カスタムLaravelバリデータで動的バリデーションルールを適用する方法

技術メモ

この記事では、Laravelでカスタムバリデータを使用して、リクエストデータに基づいて動的にバリデーションルールを適用する方法を紹介します。

バリデータの準備

まずは、カスタムバリデータを作成するために、Laravelプロジェクト内で新しいクラスを作成します。その後、必要なインスタンス変数とコンストラクタを定義します。

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\ValidationFactory;

class CustomValidator implements Rule
{
    private $dynamic_rules;
    private $validation_factory;

    public function __construct($dynamic_rules, ValidationFactory $validation_factory)
    {
        $this->dynamic_rules = $dynamic_rules;
        $this->validation_factory = $validation_factory;
    }
}

バリデーションルールを適用する方法

次に、passesメソッドを実装して、リクエストデータに基づいて動的にバリデーションルールを適用します。

public function passes($attribute, $value)
{
    preg_match('/your_pattern.(\d+).value/', $attribute, $matches);
    $index = $matches[1] ?? '';
    if ($index === '') {
        return false;
    }

    $requestData = request()->input();
    $dynamicKey = $requestData['your_data'][$index]['dynamic_key'] ?? '';

    if (!$dynamicKey) {
        return false;
    }

    $rule = $this->dynamic_rules[$dynamicKey];
    $rulesArray = explode('|', $rule);

    $validator = $this->validation_factory->make(
        [$attribute => $value],
        [$attribute => $rulesArray]
    );

    return $validator->passes();
}

バリデータのメッセージのカスタマイズ

バリデーションが失敗した場合に表示されるメッセージをカスタマイズするには、message

メソッドを実装します。

public function message()
{
    return '入力された値が無効です。';
}

実装例と注意点

この例では、リクエストデータの構造や動的キーを適切に取得するために、正規表現を使用しています。この正規表現は、あなたのプロジェクトに合わせて変更する必要があります。

また、リクエストデータの取得や動的キーの取得に失敗した場合に、falseを返すようにしています。これにより、適切なバリデーションルールが適用されない場合でも、バリデーションが失敗するようになります。

まとめ

この記事では、Laravelでカスタムバリデータを使用して、リクエストデータに基づいて動的にバリデーションルールを適用する方法を紹介しました。この方法を使用することで、リクエストデータの構造や内容に応じて柔軟なバリデーションルールを適用することができます。ただし、正規表現やリクエストデータの取得方法を適切に設定することが重要です。

コメント

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