Kohanaでそれらをすべて定義せずにモデルプロパティをオーバーライドする方法はありますか?

StackOverflow https://stackoverflow.com/questions/3859155

質問

たとえば、次のことがあります。

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_User パスワードの最大長をオーバーライドし、の検証を削除します password_confirm (これは実際のケースではなく、例です)。

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

役に立ちましたか?

解決

使用する _initialize() それ以外の __construct($id) useradminモデルをセッションに保存する場合(Authモジュールのように)。シリアル化された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();
}

他のヒント

子供のコンストラクターでは、おそらく配列要素を上書きまたは追加することができます $this->_rules, 、あなたが作成するとすぐにそれはすでに存在するので Model_UserAdmin 実例。

具体的には、in Model_UserAdmin 定義しないでください protected $rules だから、それはその親からそれを取得し、次にコンストラクターで取得します。

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

あなたがそれらを変更した場合に備えて、それらのキーが存在することを確認するために、直前に正気チェックを追加することもできます Model_User そして忘れてください。

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

編集 子供のルールをどこに配置するかについてのヒントについては、Biakaveronの答えを見てください(_initialize() コンストラクターの代わりに)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top