Skip to content

Instantly share code, notes, and snippets.

@hakomo
Created July 19, 2014 21:03
Show Gist options
  • Save hakomo/595a31fbddba345d7604 to your computer and use it in GitHub Desktop.
Save hakomo/595a31fbddba345d7604 to your computer and use it in GitHub Desktop.
Mylight Framework Validator class

愚直なバリデーションが、

<?php
$isError = false;
if(!$isError && !isset($_GET['id']))
    $_GET['id'] = 0;
if(!$isError && !is_numeric($_GET['id'])) {
    $isError = true;
    $error = 'ユーザ ID は整数です';
}
if(!$isError)
    $_GET['id'] = intval($_GET['id']);
if(!$isError && !($_GET['id'] < 100)) {
    $isError = true;
    $error = 'ユーザ ID は100未満の整数です';
}
if(!$isError) {
    $id = $_GET['id'];
    // バリデーションに成功するときの処理
} else {
    // バリデーションに失敗するときの処理
}

バリデータクラスだとこうなります。重複したり本質的ではないコードが減って、見通しが良くなります

<?php
$v = (new Validator)
    ->setDefault(0, 'set')
    ->setError('##は整数です', 'integer')
    ->set('intval')
    ->setError('##は100未満の整数です', '<', 100);
if($v->validate('get', 'id', 'ユーザ ID ')) {
    $id = $v->get();
    // バリデーションに成功するときの処理
} else {
    $error = $v->getError();
    // バリデーションに失敗するときの処理
}

Validator::setDefault, Validator::setErrorの第2引数には関数を渡すこともでき、複雑なバリデーションも可能です

<?php
$v = (new Validator)
    ->setError('##は奇数です', function($value) {
        return $value % 2 === 1;
    });

要検討

保守的に設計しましたが、保守的であることが初心者向けであるとは限らないので、意見をお伺いしたいです

Pythonはインスタンスを作るのにnewが入りません。PHPでまねするとこうなります

<?php
class Validator {
    public set() {}
}

function Validator {
    return new Validator;
}

// ださい
(new Validator)->set();

// スマート
Validator()->set();

メソッド名のset, getはいらないでしょうか?
Validator::setErrorよりもValidator::errorのほうが打ちやすいですしすっきりしますが、私は可読性が下がっている気がします

set, integer, <, emailAddressなどのバリデーション案を共有しましょう!

@foresta
Copy link

foresta commented Jul 21, 2014

案1は忘れてください笑

案2はユーザがエラーメッセージを指定した場合は、そのエラーメッセージをだして、
指定しなかったら、内部でうまいことやってエラーに即したエラーメッセージがだせればいいかなー
と思ってます。ざっくりとですみません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment