Form Package
NaifyForm
フォーム定義と入力検証パッケージ
NaifyFormとは
入力チェックの条件やエラー文言がコントローラや画面ごとに散らばると、仕様変更のたびに確認する範囲が広がります。
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()を提供します |
Field | 1項目分の名前・表示ラベル・検証ルール・項目別メッセージを組み立てます |
Message | ルール名ごとのエラーメッセージテンプレートを管理し、{%label%}などのプレースホルダーを展開します |
Validator | 定義されたフィールドと入力配列を照合し、ルール順に検証してValidationResultを生成します |
ValidationResult | 検証の成否、失敗したルール識別子、整形済みエラーメッセージを保持します |
RuleAbstract | すべての検証ルールの基底クラス。独自の検証ルールをクラスとして切り出すときに継承します |