拡張ガイド
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');
次のステップ
- ベストプラクティス - 推奨される設計パターン