May 25, 2013

FuelPHPのバリデーションで自身を除いた一意性チェック

2013/05/26 追記
より冴えた(?)方法を書きました。
http://madroom-project.blogspot.jp/2013/05/fuelphp_26.html

--

例えばユーザのアカウント名は、対応するカラムの制約がUNIQUEになりますが、これを事前にバリデーションでエラーとする方法です。

FuelPHPのValidationクラスのadd_ruleメソッドにはクロージャを登録出来ます。
http://fuelphp.jp/docs/1.6/classes/validation/errors.html#/naming_rules

クロージャに自身のレコードのidを渡せば、自身を除いた一意性チェックが出来るわけですが、以下の方法で渡せました。尚、細かく作りこんでいませんので、穴があったらごめんなさいm(_ _)m
$v = Validation::forge();
$v->add('uname', 'uname')
    ->add_rule(array('already_taken' => function($val, $self_id) {
        if (empty($self_id))
        {
            $my_uname = null;

        }
        else
        {
            $self = Model_Xxx::find($self_id);
            $my_uname = ! empty($self->uname) ? $self->uname : null;
        }

        if ($my_uname !== null and $my_uname === $val)
        {
            return true;
        }

        $ret = Model_Xxx::find_by_uname($val);
        return empty($ret);
    }), $self_id);
* $self_idが、自身のidです。
* 'already_taken'は、バリデーション用メッセージファイルの"lang/xx/validation.php"のキーに対応します。
* 別途、requiredチェックとかはして下さい。

これで、クロージャの中でInputクラスとかSessionクラスとか使わなくて済みます。

No comments:

Post a Comment