هل هناك طريقة لتجاوز خصائص النموذج دون تحديدها جميعًا مرة أخرى مع كوهانا؟

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 نموذج.

على وجه التحديد ، في 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