FuelPHPのバリデーションで自身を除いた一意性チェック
http://madroom-project.blogspot.jp/2013/05/fuelphp.html
今回は、上記の記事の内容を、より汎用的に使う方法です。
Configファイル(仮に config/app.php とします)に、以下を記述します。
<?php return array( 'functions' => array( '_validation_not_taken' => function($val, $model_name, $id, $column) { if (empty($id)) { $exclude_val = null; } else { $exclude = $model_name::find($id); $exclude_val = ! empty($exclude->$column) ? $exclude->$column : null; } if ($exclude_val !== null and $exclude_val === $val) { return true; } $method_name = 'find_by_'.$column; $model = $model_name::$method_name($val); return empty($model); } ), );以下のように使います。
$v = Validation::forge(); $v->add('uname', 'uname') ->add_rule(array('already_taken' => Arr::get(Config::get('app.functions'), '_validation_not_taken')), 'Model_Xxx', $self_id, 'uname');add_ruleに渡すパラメータは、対象のモデル名、除外したいレコードのID値、対象となるカラム名。です。
対象となるカラム名を配列で渡せるように拡張すれば、複合チェックも出来そうです。(今回はそこまではやっていませんが。)
Config::get('app.functions._validation_not_taken')のようにクロージャを直接Config::getすると、どうも
https://github.com/fuel/core/blob/888f6d914f3edca33d3ad4fab002b5ddce4bf5b1/classes/fuel.php#L341
で即コールされてしまうようで、Config::getでクロージャ一覧の配列をgetして、更にArr::getしています。
ホントは独自クラスに実装した方が良いのかもしれませんが、Configだと手元にあるファイルだけで出来て楽だなとも思いました。
No comments:
Post a Comment