入力値の検証class Validator

Validatorは入力値の検証を行うためのクラスです。

<?php // ユーザー登録を行うページ
if (Req::method() === 'POST') {
    // 検証ルールを定義
    Validator::def()
        // 必須入力, 4文字以上・20文字以下
        ->rule('name', ['required', 'lengthBetween' => [4, 20]])

        // 必須入力, 4文字以上・20文字以下, アルファベット・数字の文字列
        ->rule('user_id', ['required', 'lengthBetween' => [4, 20], 'alphaNum'])

        // 必須入力, メールアドレス形式
        ->rule('email', ['required', 'email'])

        // チェックされているか
        ->rule('agree', ['accepted']);

    if (Validator::check($_POST)) { // 入力値が正しいかチェック

        //-- ユーザー登録処理 --//

        header('Location: success.php');
        exit;
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ユーザー登録</title>
</head>
<body>
    <form method="post">
        <label>
            名前: <input type="text" name="name">
        </label>

        <label>
            ユーザーID: <input type="text" name="user_id">
        </label>

        <label>
            メールアドレス: <input type="email" name="email">
        </label>

        <label>
            <input type="checkbox" name="agree"> 利用規約に同意します。
        </label>

        <button>登録</button>
    </form>
</body>
</html>

Validatorの実装には Valitronを改変したものを使用しています。
現在、Valitron組み込みの以下の検証ルールが利用できます。

requiredequalsdifferentaccepted numericintegerarraylength lengthBetween lengthMinlengthMaxminmaxin notInipemailurlurlActive alphaalphaNumslugregexdate dateFormatdateBeforedateAftercontainscreditCard instanceOf

実際に利用する際には、ビルトインの検証ルールだけでは不足があります。
その場合は独自の検証ルールを追加することが出来ます。

以下のサンプルでは入力されたユーザーID、メールアドレスが既に登録されていないか検証するルールを追加する例です。

<?php // app/classes/Validators.php
class Validators
{
    public static function validateUnusedUserId($value)
    {
        $rs = DB::query('SELECT `user_id` FROM `users` WHERE `user_id` = ?', array($value));
        // fetchした結果がfalseなら該当するユーザーIDはない
        // 結果が取得できたら該当ユーザーあり
        return !! $rs->fetch();
    }

    public static function validateUnusedEmail($value)
    {
        $rs = DB::query('SELECT `email` FROM `users` WHERE `email` = ?', array($value));
        return !! $rs->fetch();
    }
}
<?php
RestController::create()
->whenPost(function () {
    // 検証ルールを追加する
    Validator::addRuleClass('Validators');

    Validator::def()
        ->rule('name', ['required', 'lengthMin' => 4, 'lengthMax' => 20])
        ->rule('user_id', ['required', 'lengthMin' => 4, 'lengthMax' => 20, 'UnusedUserId'])
        ->rule('email', ['required', 'email']);

    if (Validator::check($_POST) === false) {
        return Smarty::display('register.tpl');
    }

    // 登録処理
})

->whenGet(function () { Smarty::display('register.tpl'); })
->execute();

Validator::addRuleClassは指定されたクラス内のvalidateから始まるメソッドを検証ルールとして追加します。 サンプルコード内ではvalidateUnusedUserIdメソッドUnusedUserIdとして登録されています。