fuelphpのvalidationについて
filedsetに対して定義できるものと、modelに対して定義できるものがある。
Fieldsetのvalidation
Fieldsetと1対1で紐付いたvalidationインスタンスのrunメソッド(return bool)を呼び出す。
$fieldset->validation()->run()
ruleの設定
各fieldに対して個別にadd_ruleで設定可能。
デフォルトで用意されているルールは下記サイトの下部を参照
http://fuelphp.jp/docs/1.9/classes/validation/methods.html
メッセージの設定
下記のいずれかの方法で可能
app/lang/ja/validation.php
に書く- Validationインスタンスに対して設定する
$fieldse->validation()->set_message(‘ルール名’, ‘メッセージ’)
- 各fieldに設定する
$fieldset->field(‘field名’)->set_error_message(‘ルール名’, ‘メッセージ’)
カスタムルール
validationインスタンスは _find_rule
メソッド内で、 $thi->callablesに設定されているオブジェクトの prefixが _validationのメソッドを探しいく。
デフォルトではvalidationインスタンス自身が設定されているので、Fuel\Core\Validation
内のprefixが_validationのメソッドが適用できるようになってい
る。
callablesはvalidationインスタンスのadd_callableで追加できるので、_validation_***
が定義されているクラスであれば何でもok(Fieldset自身とか、専用の Validation_Callable_Hoge のようなクラスを作ったりとか)
またadd_callableで設定しておかなくても、validationインスタンスのrunメソッドの第三引数に$temp_callableを渡せる。
modelのvalidationでカスタムルールをモデル内に定義できるのもこれで実現させてる。
https://github.com/fuel/orm/blob/1.9/develop/classes/observer/validation.php#L232
modelのvalidation
ミニマムのサンプル
<?php class Model_Post extends \Orm\Model { protected static $_properties = array( 'id', 'title' => [ 'validation' => [ 'required', 'max_length' => [1], 'contains_hoge' ] ], ); protected static $_observers = array( 'Orm\Observer_Validation' => ['events' => ['before_save']] ); protected static $_table_name = 'posts'; public function _validation_contains_hoge($val) { return (bool)preg_match('/hoge/', $val); } }
$_properties
のvalidation
に設定できる_validation_***
という命名規則でmodelにカスタムバリデーションを定義できる- 上記の指定だと
before_save
時にバリデーションが実行される - fail時は
Orm/ValidationFailed
がthrowされる - errorメッセージは
app/lang/validation.php
でruleごとに定義できる(model内では設定できないぽい) - 全体の表示の用のメッセージは $e->message で取得(フォーマットはConfigのvalidationで設定可能)
- エラーの個別の取得は $e->get_fieldset() でmodelから生成したFieldsetが取得できるので、Fieldsetのインターフェース経由で行える。
$e->get_fieldset()→error('title')
仕組み
modelのpropertiesの設定から動的にFieldsetを生成し、Fieldsetのvalidationの機能を利用して実現させてる。