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);
    }
}
  • $_propertiesvalidationに設定できる
  • _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の機能を利用して実現させてる。