NoraLib Validation API Documentation

拡張ガイド

NoraLib Validationは簡単に拡張できます。カスタムバリデーションルールの作成方法を説明します。

カスタムルールの作成

方法1: クロージャを使用

簡単なバリデーションには custom() メソッドが便利です:

$validator = new Validator();

$evenNumberValidator = $validator->custom(
    function($value) {
        return is_numeric($value) && $value % 2 === 0;
    },
    '偶数を入力してください'
);

if ($evenNumberValidator->validate(4)) {
    echo "有効";
}

方法2: AbstractRuleを継承

再利用可能なルールには、クラスを作成します:

use NoraLib\Validation\Rule\AbstractRule;

class EvenNumberRule extends AbstractRule
{
    public function __construct(
        protected string $message = "偶数を入力してください"
    ) {
        parent::__construct($message);
    }

    public function validate($value): bool
    {
        if (empty($value)) {
            return true; // 空の値は許可(notEmptyと組み合わせる)
        }
        
        return is_numeric($value) && $value % 2 === 0;
    }
}

カスタム例外の作成

詳細なエラー情報を提供するには、カスタム例外を作成します:

use NoraLib\Validation\Rule\Exception\AbstractException;

class EvenNumberException extends AbstractException
{
    public function __construct(
        string $message = "偶数を入力してください",
        int $code = 0,
        ?\Throwable $previous = null
    ) {
        parent::__construct($message, $code, $previous);
    }
}

そして、 assert() メソッドをルールに追加:

class EvenNumberRule extends AbstractRule
{
    public function validate($value): bool
    {
        if (empty($value)) return true;
        return is_numeric($value) && $value % 2 === 0;
    }

    public function assert($value): void
    {
        if (!$this->validate($value)) {
            throw new EvenNumberException($this->message);
        }
    }
}

RegexRuleを使った簡単な拡張

正規表現ベースのバリデーションには、既存の RegexRule が使えます:

// 郵便番号バリデーション
$zipCodeValidator = $validator->regex(
    '/^\d{3}-\d{4}$/',
    '郵便番号は123-4567の形式で入力してください'
);

// 電話番号バリデーション
$phoneValidator = $validator->regex(
    '/^0\d{1,4}-\d{1,4}-\d{4}$/',
    '電話番号の形式が正しくありません'
);

ポリシーの作成

複数のルールを組み合わせたポリシーを定義できます:

use NoraLib\Validation\Rule\{
    LengthRule,
    NotEmptyRule,
    RegexRule
};

$validator = new Validator();

// ユーザー名ポリシー
$validator->setPolicy('username', [
    new NotEmptyRule(),
    new LengthRule(3, 20),
    new RegexRule('/^[a-zA-Z0-9_]+$/', '英数字とアンダースコアのみ使用できます'),
]);

// 使用
$usernameValidator = $validator->policy('username');

次のステップ

Search results