Zend Framework: Zend_Registry bir tuşa unset nasıl?

6 Cevap php

Benim Zend Framework uygulama test ediyorum ve belirli bir anahtar kayıt defterinde ayarlayın değilken şey olur test etmek istiyorum. Bu test ediyorum işlevi:

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;
}

Nasıl kayıt defterindeki bir anahtar unset olabilir? Bunu denedim, ancak işe yaramadı:

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

Update: Ne gerçekten bilmek istiyorum ben yapılandırma dosyasında "domain" anahtarı ayarlanmamış benim yöntem bir istisna atar sınamak nasıl olduğunu.

6 Cevap

Yapılandırma nesnesinin değerini değiştirmek için tek gerçek yol, söz konusu değişken, unset öğeye dökümü config için anahtarı silmek için kayıt isteyin ve sonra sıfırlamak olacaktır.

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

Ancak, bu iş için bunu kayıt içine ilk defa ayarlanır önce düzenlenebilir için Zend_Config nesneyi ayarlamak olması gerekirdi.

Bunu bu şekilde kayıt defterini düzenlemek için iyi bir uygulama olmadığını düşünmelisiniz. Özel olarak, Zend_Config nesne ilk örneği bir kez sabit olacak şekilde tasarlanmıştır.

Ben yeterince iyi sorununuzu anladım umut!

If your 'config' is actually Zend_Config, then by default it's read-only. Zend_Config constructor's optional second parameter is boolean $allowModifications, by default set to false.

Muhtemelen Zend_Config_Ini in bootstrap.php ile oluşturmak

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

$allowModifications param append:

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

Deneyin:

unset($config->domain);

Ve sonra yeniden kayıt $registry->config modifiye Zend_Config sınıfı ile. vartec said, düzenlenebilir olarak Zend_Config örneğini gerekecek gibi, unutmayın:

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

Aramak çalışıyoruz __unset yöntemi magic method Eğer örneğinde unset kullandığınızda denir olmasıdır.

Ben $ config silme önce Zend_Registry depolanan $ config, bir değeri silmek için çalışıyoruz görüyorum. değerini silme Zend_Registry içinde saklanan $ config değerini etkilemez eğer öyleyse, ben Zend_Registry arayarak :: () Eğer $ config değeri ve Zend_Registry içinde $ config değil bir başvuru yaşıyorsanız olsun varsayalım. Eğer kopyalanan $ config şey değiştirdiğinizde, bu depolanan bir etkilemez. Ben ilk önce $ yapılandırma değiştirmek önermek, ve sonra tekrar Zend_Registry yılında $ yapılandırma ayarlayarak, kayıt defterinde $ yapılandırma üzerine.

Ben size cevabı burada bulabilirsiniz düşünüyorum:

http://framework.zend.com/issues/browse/ZF-2752

Başlığı Zend_Registry anahtar unset, sorar ne başarmak isteyenler için:

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

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

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