nora-lib/validation

Installs: 93

Dependents: 1

Suggesters: 0

Security: 0

pkg:composer/nora-lib/validation

v1.0.0 2025-12-28 05:55 UTC

This package is auto-updated.

Last update: 2025-12-28 13:40:12 UTC


README

PHPバリデーションライブラリ - シンプルで拡張可能なバリデーション機能を提供

Test Coverage

インストール

composer require nora-lib/validation

基本的な使い方

シンプルなバリデーション

use NoraLib\Validation\Validator;

$validator = new Validator();

// 空でないことをチェック
$emailValidator = $validator->notEmpty()->validEmail();
if ($emailValidator->validate($email)) {
    echo "有効なメールアドレスです";
}

複数のルールを組み合わせる

$passwordValidator = $validator
    ->notEmpty()
    ->length(min: 8, max: 20)
    ->passwordStrength();

if (!$passwordValidator->validate($password)) {
    // バリデーション失敗
}

配列のバリデーション

$userValidator = $validator->array([
    'name' => $validator->notEmpty()->length(min: 2, max: 50),
    'email' => $validator->validEmail(),
    'age' => $validator->notEmpty(),
]);

$userData = [
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'age' => 25,
];

if ($userValidator->validate($userData)) {
    echo "ユーザーデータは有効です";
}

エラーハンドリング

use NoraLib\Validation\Exception\ValidationalError;
use NoraLib\Validation\Rule\Exception\NotEmptyException;
use NoraLib\Validation\Rule\Exception\ExceptionGroup;

try {
    $validator->notEmpty()->assert($value);
} catch (NotEmptyException $e) {
    echo $e->getMessage(); // "入力してください。"
}

// 配列バリデーションのエラー
try {
    $userValidator->assert($invalidData);
} catch (ExceptionGroup $e) {
    $error = ValidationalError::createFromValidator($e);
    $payload = $error->buildPayload(); // エラー詳細を取得
}

利用可能なバリデーションルール

  • notEmpty() - 空でないことをチェック
  • length(min, max) - 文字数チェック
  • validEmail() - メールアドレス形式チェック
  • validUrl() - URL形式チェック
  • passwordStrength() - パスワード強度チェック
  • passwordComplexity(complexity) - パスワード複雑性チェック
  • passwordNoCommonWord() - よくあるパスワードの除外
  • regex(pattern, message) - 正規表現マッチング
  • custom(callback, message) - カスタムバリデーション
  • filter(filter) - PHPフィルター関数
  • array(spec) - 配列バリデーション
  • policy(name) - ポリシーベースバリデーション

ポリシーベースバリデーション

複数のルールをポリシーとして定義できます:

use NoraLib\Validation\Rule\LengthRule;
use NoraLib\Validation\Rule\PasswordComplexityRule;
use NoraLib\Validation\Rule\PasswordNoCommonWordRule;
use NoraLib\Validation\Rule\NotEmptyRule;

$validator = new Validator();
$validator->setPolicy('strong_password', [
    new LengthRule(8, 20),
    new PasswordComplexityRule(3),
    new PasswordNoCommonWordRule(),
    new NotEmptyRule(),
]);

$policyValidator = $validator->policy('strong_password');
if ($policyValidator->validate($password)) {
    echo "強力なパスワードです";
}

カスタムバリデーションルール

独自のバリデーションルールを作成できます:

// カスタムルールを使用
$customValidator = $validator->custom(function($value) {
    return $value === 'expected';
}, 'カスタムエラーメッセージ');

// または AbstractRule を継承してクラスを作成
use NoraLib\Validation\Rule\AbstractRule;

class MyCustomRule extends AbstractRule
{
    public function __construct(
        protected string $message = "エラーメッセージ"
    ) {
        parent::__construct($message);
    }

    public function validate($value): bool
    {
        // カスタムロジック
        return true;
    }
}

BEAR.Sunday統合

NoraLib ValidationはBEAR.Sundayと簡単に統合できます。推奨アプローチは、JsonRestInterceptorパターンです。

特徴

  • Ray.Validationの@OnValidateで型安全性を確保
  • NoraLib Validationの詳細なエラー情報を活用
  • 統一されたJSONレスポンス構造
  • エラーレベル別のログ出力

基本的な使い方

use BEAR\Resource\ResourceObject;
use Ray\Validation\Annotation\Valid;
use Ray\Validation\Annotation\OnValidate;
use NoraLib\Validation\Validator;

class Users extends ResourceObject
{
    /**
     * @Valid
     */
    #[JsonRest]
    public function onPost(array $userData): static
    {
        // バリデーション済みデータで処理
        $userId = $this->createUser($userData);

        $this->code = 201;
        $this->body = ['id' => $userId];

        return $this;
    }

    /**
     * @OnValidate
     */
    public function onValidatePost(mixed $userData): \Ray\Validation\Validation
    {
        // 型チェック
        if (!is_array($userData)) {
            throw new \NoraLib\Validation\Exception\ValidationalError(
                input_key: 'userData',
                message: 'Request body must be an array'
            );
        }

        // NoraLib Validationで詳細チェック
        $validator = new Validator();
        $userValidator = $validator->array([
            'email' => $validator->validEmail(),
            'password' => $validator
                ->notEmpty()
                ->length(min: 12)
                ->passwordComplexity(4)
                ->passwordNoCommonWord(),
        ]);

        $userValidator->assert($userData);

        return new \Ray\Validation\Validation();
    }
}

レスポンス例

成功時(HTTP 201):

{
  "info": {"status": "ok"},
  "payload": {"id": 123}
}

バリデーションエラー時(HTTP 422):

{
  "info": {
    "status": "error",
    "message": "Validation failed"
  },
  "payload": {
    "description": ["Invalid email format"],
    "errors": [
      {
        "input": "email",
        "label": "email",
        "message": "Invalid email format"
      }
    ]
  }
}

詳細はBEAR.Sunday統合ガイドを参照してください。

テストカバレッジ

このライブラリは93%のテストカバレッジを達成しており、CI/CDで80%未満の場合はビルドが失敗します。

# テスト実行
composer test

# カバレッジ付きテスト
composer coverage

APIドキュメント

詳細なAPIドキュメントはGitLab Pagesで公開されています。

ライセンス

MIT License

開発

要件

  • PHP ^8.3.0

セットアップ

git clone <repository-url>
cd validation
composer install

テスト

composer test        # テスト実行
composer coverage    # カバレッジ付きテスト
composer cs          # コードスタイルチェック
composer sa          # 静的解析
composer docs        # APIドキュメント生成

ビルド

composer build       # 全チェック + カバレッジ + メトリクス