4 Stimmen

Zend Framework: Wie wird ein Schlüssel in Zend_Registry entfernt?

Ich teste meine Zend Framework-Anwendung und möchte testen, ob etwas passiert, wenn ein bestimmter Schlüssel nicht im Registry gesetzt ist. Dies ist die Funktion, die ich teste:

protected function getDomainFromConfig() {
    $config = Zend_Registry::get('config');
    if (!isset($config->domain)) {
        throw new Exception('Bitte stellen Sie sicher, dass Sie "domain" in Ihrer Konfigurationsdatei festgelegt haben und dass Ihre Konfigurationsdatei im Zend_Registry gesetzt ist.');
    }
    return $config->domain;
}

Wie kann ich einen Schlüssel im Registry löschen? Ich habe es versucht, aber es hat nicht funktioniert:

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

Update: Was ich wirklich wissen möchte, ist, wie ich testen soll, dass meine Methode eine Ausnahme wirft, wenn der Schlüssel "domain" in der Konfigurationsdatei nicht festgelegt ist.

0 Stimmen

Ich denke, du findest deine Antwort hier: http://framework.zend.com/issues/browse/ZF-2752

0 Stimmen

Wenn Sie dem in meiner Antwort gegebenen Ratschlag folgen, sollten Sie damit getestet haben, dass die Ausnahme ausgelöst wird. Andernfalls möchten Sie es vielleicht akzeptieren?

8voto

tombazza Punkte 646

Der einzige echte Weg, den Wert des Konfigurationsobjekts zu ändern, besteht darin, es in eine Variable zu speichern, das betreffende Element zu löschen, das Register zu bitten, den Schlüssel für die Konfiguration zu löschen und es dann zurückzusetzen.

get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>

Allerdings müssten Sie dafür das Zend_Config-Objekt vor dem ersten Mal, dass es in das Register gesetzt wird, auf bearbeitbar gesetzt haben.

Sie sollten beachten, dass es nicht bewährte Praxis ist, das Register auf diese Weise zu bearbeiten. Insbesondere ist das Zend_Config-Objekt darauf ausgelegt, einmal instanziiert statisch zu sein.

Ich hoffe, ich habe Ihr Problem gut genug verstanden!

1 Stimmen

Ich arbeite nicht mehr an diesem Projekt, daher hatte ich keine Gelegenheit, Ihre Antwort zu überprüfen. Ich akzeptiere sie jedoch auf der Grundlage der Anzahl der Benutzerstimmen.

1voto

vartec Punkte 124396

Wenn Ihre 'config' tatsächlich Zend_Config ist, ist sie standardmäßig schreibgeschützt. Der optionale zweite Parameter des Zend_Config-Konstruktors ist ein boolescher $allowModifications, der standardmäßig auf false gesetzt ist.

Sie erstellen wahrscheinlich Zend_Config_Ini in bootstrap.php mit

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

Fügen Sie den $allowModifications-Parameter hinzu:

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

0 Stimmen

Das ist genau die Fehlermeldung, die ich bekomme: Zend_Registry ist schreibgeschützt. Ich brauche eine Möglichkeit, es zu fälschen. Vielleicht gibt es einen anderen Weg, es zu tun, anstatt es tatsächlich "zu löschen".

0 Stimmen

Zend_Registry oder Zend_Config?

0voto

Ross Punkte 44536

Versuchen Sie es:

unset($config->domain);

Und registrieren Sie dann $registry->config mit der modifizierten Klasse Zend_Config erneut. Beachten Sie, dass Sie, wie vartec sagte, Ihre Instanz von Zend_Config als bearbeitbar instanziieren müssen:

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

Die Methode __unset, die Sie aufrufen möchten, ist eine magische Methode, die aufgerufen wird, wenn Sie unset auf der Instanz verwenden.

0 Stimmen

Unset($config->domain) ruft $config->__unset('domain') auf, also macht es keinen Unterschied.

0voto

farzad Punkte 8635

Ich sehe, dass du versuchst, einen Wert im $config zu löschen, wobei $config in Zend_Registry gespeichert ist, bevor er gelöscht wird. Wenn das Löschen des Werts den gespeicherten $config-Wert in Zend_Registry nicht beeinflusst, nehme ich an, dass du durch den Aufruf von Zend_Registry::get() den Wert von $config hast und nicht eine Referenz auf den $config in Zend_Registry. Also, wenn du etwas im kopierten $config änderst, wird es den gespeicherten nicht beeinflussen. Ich schlage vor, dass du zuerst den $config änderst und dann den $config im Register überschreibst, indem du den $config in Zend_Registry erneut setzt.

0voto

Sonny Punkte 7924

Für diejenigen, die das tun möchten, was der Titel verlangt, um einen Zend_Registry-Schlüssel aufzuheben:

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

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

Aufruf mit: My_Registry::delete('Schlüssel')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X