LoginSignup
3
3

More than 5 years have passed since last update.

FuelPHP のバリデーションにて一意性をチェックする独自バリデーション

Posted at

例えばメールアドレスや電話番号。

ユーザー登録の処理などの際に、新規ならば、存在していないことをチェックしたいし、更新ならば、現在の自分自身のレコード以外を対象に存在していない値であることを確認したいもの。

それ用の独自バリデーションを作る。

より効率的な書き方がある気がするけど、とりあえずの物を。

実現方法

  1. 現在の Controller 名を取得する

  2. Controller に対応する Action を取得する

  3. 取得した Controller と Action に応じた処理をゴニョゴニョする

準備

  • APPPATH/classes/myuti/validation/common.php に準備すると仮定。

  • 呼び出し元で使えるようにする(お好きな方法で)

APPPATH/classes/myuti/validation/common.php にバリデーション用ファイルを準備する

APPPATH/classes/myuti/validation/common.php
<?php
class MyUtil_Validation_Common {

    public static function _validation_is_unique_value($val)
    {
        // フィールド名を取得:このフィールド名に対して既にレコードが存在するかどうかを確認
        $filed_name = \Validation::active_field()->name;

        switch (strtolower(Request::main()->controller))
        {
            case 'controller_admin_maintenance_user':
                //
                $model_name = '\\Auth\\Model\\Auth_user';
                switch (strtolower(Request::main()->action))
                {
                    case 'create':
                        // create
                        $values = $model_name::find('all',array(
                            'where' => array(
                                array($filed_name, $val),
                            ),
                        ));
                        if (count($values))
                        {
                            return false;
                        }
                    break;
                    case 'edit':
                        // edit
                        // URI last Segment will be target_id
                        $current_id = Request::main()->uri->segment(count(Request::main()->uri->segments()));
                        $values = $model_name::find('all',array(
                            'where' => array(
                                array('id', $current_id),
                            ),
                        ));
                        if (count($values) != 1)
                        {
                            return false;
                        }
                        $origin_value = $values[$current_id]->$filed_name;
                        if ($origin_value != $val)
                        {
                            // 元の $field_name から値が変わっているので、新しい値が既に存在していたら return false する
                            $values = $model_name::find('all',array(
                                'where' => array(
                                    array($filed_name, $val),
                                ),
                            ));
                            if (count($values))
                            {
                                return false;
                            }
                        }
                    break;
                    default:
                        return false;
                    break;
                }
            break;
            default:
                return false;
            break;
        }

        return true;
    }
}

こんな感じでどうでしょうか。

課題とか

  • Switch文を増やしていけばそれなりに処理出来る気がします。が、Switch文を増やしていくのもなんか嫌。

  • ルーティングへの対応を入れてないのがダメ

  • Edit の時の URI 判定をもう少し妥当なやり方にしないとまずい

とか、なんだか色々あります…

イマイチな感じやけど、とりあえず。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3