1

たとえば、次のようなものがあります。

class Model_User extends ORM {
    protected $_rules = array(
        'username' => array(
            'not_empty'  => NULL,
            'min_length' => array(6),
            'max_length' => array(250),
            'regex'      => array('/^[-\pL\pN_@.]++$/uD'),
        ),
        'password' => array(
            'not_empty'  => NULL,
            'min_length' => array(5),
            'max_length' => array(30),
        ),
        'password_confirm' => array(
            'matches'    => array('password'),
        ),
    );
}

class Model_UserAdmin extends Model_User {
    protected $_rules = array(
        'username' => array(
            'not_empty'  => NULL,
            'min_length' => array(6),
            'max_length' => array(250),
            'regex'      => array('/^[-\pL\pN_@.]++$/uD'),
        ),
        'password' => array(
            'not_empty'  => NULL,
            'min_length' => array(5),
            'max_length' => array(42),
        ),
    ); 
}

ここでは、パスワードの最大長をModel_UserAdmin拡張して上書きし、検証を削除します(これは実際のケースではなく、例です)。Model_Userpassword_confirm

$_rulesプロパティ/配列全体を再定義する代わりに、より良い方法はありますか?

4

2 に答える 2

4

UserAdmin モデルをセッションに保存する場合 (Auth モジュールのように)_initialize()の代わりに使用します。__construct($id)シリアル化された ORM オブジェクトは を呼び出さない__construct()ため、ルールの一部が失われます。_initialize()メソッドは、table_name、関係などのモデル プロパティのデフォルト値を設定します

protected function _initialize()
{
   // redefine model rules
   $this->_rules['password']['max_length'] = 42 ;
   unset($this->_rules['password_confirm']) ;
   // call parent method
   parent::_initialize();
}
于 2010-10-05T09:21:47.447 に答える
2

子のコンストラクターでは、インスタンス$this->_rulesを作成するとすぐに既に存在するため、おそらく配列要素を上書きまたは追加できます。Model_UserAdmin

具体的には、Model_UserAdmina を定義しないprotected $rulesで親から取得し、コンストラクターで次のようにします。

$this->_rules['password']['max_length'] = 42 ;
unset($this->_rules['password_confirm']) ;

Model_Userキーを変更して忘れた場合に備えて、これらのキーが存在することを確認する直前にサニティ チェックを追加することもできます。

正確にはエレガントではありませんが、うまくいくはずです。より正式な方法でルールを変更するいくつかのラッパー関数をその周りに作成できると思います (おそらく、class ORM extends ORM_CoreORM を拡張するときに使用できるようになります)。

編集子ルールを配置する場所に関するヒントについては、ビアカヴェロンの回答をご覧ください(コンストラク_initialize()ターの代わりに)

于 2010-10-04T21:55:14.343 に答える