سؤال

أنا أختبر تطبيق Zend Framework الخاص بي وأرغب في اختبار حدوث شيء ما عندما لا يتم تعيين مفتاح معين في السجل. هذه هي الوظيفة التي أختبرها:

protected function getDomainFromConfig() {
    $config = Zend_Registry::get('config');
    if (!isset($config->domain)) {
        throw new Exception('Please make sure you have "domain" set in your config file and your config file is being set in the Zend_Registry.');
    }
    return $config->domain;
}

كيف يمكنني إلغاء ضبط مفتاح في السجل؟ حاولت هذا ، لكنه لم ينجح:

$config = Zend_Registry::get('config');
$config->__unset('domain');

تحديث: ما أريد حقًا معرفته هو كيف يجب أن أختبر أن طريقتي ترمي استثناء عندما لا يتم تعيين مفتاح "المجال" في ملف التكوين.

هل كانت مفيدة؟

المحلول

تتمثل الطريقة الحقيقية الوحيدة لتغيير قيمة كائن التكوين في تفريغها إلى متغير ، واطلب من العنصر المعني ، واطلب من السجل حذف المفتاح للتكوين ، ثم إعادة ضبطه.

<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>

ومع ذلك ، لكي يعمل هذا ، يجب أن تقوم بتعيين كائن Zend_Config على قابلة للتحرير قبل تعيينه في السجل في المرة الأولى.

يجب أن تفكر في أنه ليس من الأفضل تعديل السجل بهذه الطريقة. على وجه الخصوص ، تم تصميم كائن Zend_Config ليكون ثابتًا بمجرد إنشاء مثيل له في الأصل.

آمل أن أكون قد فهمت مشكلتك جيدًا بما فيه الكفاية!

نصائح أخرى

إذا كان "التكوين" الخاص بك هو في الواقع Zend_Config, ، ثم افتراضيًا ، إنه للقراءة فقط.Zend_Config المعلمة الثانية الاختيارية للبناء هي منطقية $allowModifications, ، بشكل افتراضي تعيين إلى false.

ربما تقوم بإنشاء Zend_Config_Ini في bootstrap.php مع

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT)

ألحق $allowModifications بارام:

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT, 
                    true)

محاولة:

unset($config->domain);

ثم إعادة التسجيل $registry->config مع تعديل Zend_Config صف دراسي. لاحظ أنه ، كما قال Vartec ، يجب عليك إنشاء مثيل لك Zend_Config مثيل قابلة للتحرير:

$config = new Zend_Config('filename', true);

ال __unset الطريقة التي تحاول الاتصال بها هي طريقة السحر وهذا ما يسمى عند استخدامك unset على الحالة.

I'm seeing you are trying to delete a value in the $config, where $config is stored in Zend_Registry before deletion. so if deleting the value does not affect the stored $config value in Zend_Registry, I assume that by calling Zend_Registry::get() you are having the value of $config and not a reference to the $config in Zend_Registry. so when you change something in the copied $config, it will not affect the stored one. I suggest you first change the $config, and then overwrite the $config in the registry, by setting the $config in Zend_Registry again.

For those looking to accomplish what the title asks, to unset a Zend_Registry key:

class My_Registry extends Zend_Registry
{
    /**
     *
     * @param type $index
     */
    public static function delete($index)
    {
        $instance = self::getInstance();

        if ($instance->offsetExists($index)) {
            $instance->offsetUnset($index);
        }
    }
}

Call by: My_Registry::delete('key')

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top