2012年7月19日木曜日

FuelPHPのバリデーション

簡単にですがバリデーションを使ってみました。

書き方っていうかどこに書くのかコントローラなのかモデルなのか。
業務のほうではモデルに書いてみましたがここではコントローラにそのまま書いた例を。
コードはこんなかんじです。

public function action_create()
{
    $auth = Auth::instance();

    if (Input::method() == 'POST')
    {
        $val = Validation::forge();

        $val->add('num', 'Number')
            ->add_rule('required')
            ->add_rule('valid_string', array('numeric'));

        $val->add('name', 'Name')
            ->add_rule('required');

        $val->add('login_id', 'LoginID')
            ->add_rule('required')
            ->add_rule('min_length', '4');

        $val->add('password', 'Password')
            ->add_rule('required')
            ->add_rule('min_length', '6');

        $val->add('password_conf', 'PasswordConf')
            ->add_rule('match_field', 'password');

        if ($val->run())
        {
            // バリデーションOKの場合
            $user = Model_User::forge(array(
                        'num' => $val->validated('num'),
                        'name' => $val->validated('name'),
                        'login_id' => $val->validated('login_id'),
                        'password' => $auth->hash_password($val->vaildated('password')),
                    ));
            if ($user->save())
            {
                Response::redirect('user');
            }
        }
        else
        {
            // バリデーションNGの場合
            Session::set_flash('error', $val->show_errors());
        }
    }

    $this->template->title = '新規作成';
    $this->template->content = View::forge('user/edit');
}

バリデーションの部分ですが Validation::forge() で返ってきたオブジェクトをもとにルールを追加していきます。
ここで使っているのは required(必須)、valid_string[numeric](数値チェック)、min_length(最小文字数)、match_field(指定したフィールドと合っているか)
$val->add や $val->add_field で一行で書いてしまうこともできますが、ルールが増えた場合見づらいのかなって思ってこの方法を選びました。


バリデーションの種類は他にもいろいろありますが、そこはマニュアルを参照してください。
http://docs.fuelphp.com/classes/validation/validation.html#rules



次に独自にバリデーションを作りたい場合ですね。
良い例が思いつかないのですが valid_string を使うことで数字や英字などのチェックをすることは可能です。しかしながらちょっと面倒だとかんじるひとやエラーメッセージで区別がつきづらいというひともいるのではないかと思います。

簡単な例ですが fuel/app/classes/myvalidation.php を作成します。
class MyValidation
{
    // 数字チェック
    public function _validation_valid_numeric($val)
    {
        return (preg_match('/^[0-9]+$/', $val) > 0);
    }

    // アルファベットチェック
    public function _valition_valid_alpha($val)
    {
        return (preg_match('/^[a-zA-Z]+$/', $val) > 0);
    }
}

メソッドの中身は大したことありません。メソッド名の先頭に _validation がつくくらいです。

これを実際に使う場合は
$val = Validation::forge();
$val->add_callable('MyValidation');

$val->add('num', 'Number')
    ->add_rule('required')
    ->add_rule('valid_numeric');

こんなかんじ。
add_callable で独自のバリデーションクラスを読み込ませ、あとは一緒です。
簡単ですね。

ぜひ試してみてください。




0 件のコメント:

コメントを投稿