هل هناك طريقة لتجاوز خصائص النموذج دون تحديدها جميعًا مرة أخرى مع كوهانا؟
-
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
نموذج.
على وجه التحديد ، في 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()
بدلا من المنشئ)