Form Package

NaifyForm

フォーム定義と入力検証パッケージ

受付項目の定義と入力検証 ルール別・項目別メッセージ管理 HTTP・DB・Viewから独立 PHP 8.0+

とは

入力チェックの条件やエラー文言がコントローラや画面ごとに散らばると、仕様変更のたびに確認する範囲が広がります。

NaifyForm(ナイフィフォーム)は、受け付けるフィールドの定義、入力値の検証、エラーメッセージの整形・管理を1か所にまとめるパッケージです。Form・Field・Validator・Messageに役割を分け、どの項目をどのルールで検証するかをコード上で追いやすくしています。

HTTPリクエストやセッション、DB、テンプレートエンジンには直接依存しません。配列の入力データを渡して検証できるため、WebフォームだけでなくAPIやバッチ処理の入力チェックにも同じ書き方で使えます。

使い始めるには

NaifyForm\NaifyFormからフォームを生成し、set()で受け付ける項目と検証ルールを定義します。Session::form()やSession::csrf()と組み合わせた確認画面付きフォーム(入力→確認→登録→完了)の全体コードは、フォームと入力検証の実装例で紹介しています。

use NaifyForm\NaifyForm;

require __DIR__ . '/libs/NaifyForm/NaifyForm.php';
NaifyForm::boot();

$form = NaifyForm::create($_POST);

$form->set('name', 'お名前')
    ->required()
    ->isString()
    ->length(1, 50);

$form->set('email', 'メールアドレス')
    ->required()
    ->isString()
    ->isEmail();

$form->set('age', '年齢')
    ->isInteger()
    ->range(18, 120);

if ($form->validate()->hasError()) {
    $messages = $form->getMessages();     // 項目ごとのエラーメッセージ配列
    $errorList = $form->getMessageList(); // 1次元のエラーメッセージ一覧
    return;
}

// 定義したフィールド(name, email, age)の入力値だけを取得する
$data = $form->getInput();

getInput()は、set()で定義した項目のキーだけを元の入力配列から抽出して返します。未定義の余分なパラメータが後続の処理へ混ざるのを防げます。値の型変換やトリムなどの暗黙な書き換えは行いません。

検証ルールとメッセージ管理

Fieldのメソッドをつなげて、必須・型・文字種・長さ・数値範囲・選択肢・他項目との一致・トークン一致などのルールを登録できます。

分類主なメソッド検証内容
必須・基本型required() / isString() / isInteger() / isNumeric()必須入力(空白のみも不可)、文字列、整数、数値の確認。これらは書式ルールより先に評価され、失敗時はその項目の後続ルールを止めます
書式・文字種isEmail() / isKana() / isZenkaku() / isHankaku() / isHankakuAlnum() / regex()メールアドレス、全角カナ、全角文字、半角ASCII、半角英数字、正規表現の確認。未入力時はスキップされ、必須チェックはrequired()と組み合わせます
長さ・範囲・候補length() / exactLength() / range() / in()文字数の最小・最大・固定長、数値の最小・最大、許可リストに含まれるかの確認
比較・トークン・独自条件equal() / sameField() / isToken() / custom() / rule()固定値との一致、確認用メールアドレスなど他項目との一致、CSRF等のトークン一致、クロージャや独自RuleAbstractクラスによる検証

エラーメッセージは、アプリ全体の共通文言、特定項目だけの文言、フィールド個別の文言の順で上書きできます。DBの重複確認など、単項目ルール以外の業務エラーもaddError()で同じ結果にまとめられます。

// アプリ全体や特定項目のメッセージをまとめて設定する
NaifyForm::message()->load([
    'is_required'       => '{%label%}を入力してください。',
    'email.is_required' => '連絡先メールアドレスは必須です。',
]);

// フィールド単位でメッセージを上書きする
$form->set('password_confirm', '確認用パスワード')
    ->required()
    ->sameField('password')
    ->message->set('is_same_field', '{%same_field%}と同じ値を入力してください。');

// ルール検証のあとに業務上のエラーを追加する
if (!$form->validate()->hasError() && $userRepo->existsEmail($form->getInput()['email'])) {
    $form->addError('email', 'このメールアドレスはすでに登録されています。', 'duplicate');
}

対応する範囲

含むもの

  • 受付フィールドの定義と許可キーの抽出
  • 必須・型・文字種・範囲・項目間比較・トークンの検証
  • クロージャや独自クラスによる検証ルールの追加
  • ルール別・項目別のエラーメッセージ管理
  • 業務エラーの追加と検証結果の保持

含まないもの

  • HTTPリクエストやセッションへの直接依存
  • HTMLフォームタグの自動生成
  • DBへの保存や重複検索の実行
  • 入力値の暗黙な型変換・トリム・書き換え

主要クラス

普段の実装では、入口のNaifyFormと、項目定義・検証結果を受け持つForm・Fieldを中心に使います。

クラス役割
NaifyFormパッケージの入口。オートローダーの登録、Formの生成、共通Messageの取得を担当します
Formフィールド定義、入力配列、検証結果を保持します。set()・validate()・getInput()・addError()を提供します
Field1項目分の名前・表示ラベル・検証ルール・項目別メッセージを組み立てます
Messageルール名ごとのエラーメッセージテンプレートを管理し、{%label%}などのプレースホルダーを展開します
Validator定義されたフィールドと入力配列を照合し、ルール順に検証してValidationResultを生成します
ValidationResult検証の成否、失敗したルール識別子、整形済みエラーメッセージを保持します
RuleAbstractすべての検証ルールの基底クラス。独自の検証ルールをクラスとして切り出すときに継承します