Kohanaでそれらをすべて定義せずにモデルプロパティをオーバーライドする方法はありますか?
-
27-09-2019 - |
質問
たとえば、次のことがあります。
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()
コンストラクターの代わりに)