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

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

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

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

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

## 実現方法

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 判定をもう少し妥当なやり方にしないとまずい

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

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