Sonntag, Juni 7, 2020

Zend Framework 2 – Umleitung aus innerhalb einer Controller-Plugin ohne Rückgabe

Ist möglich ist, leiten Sie den Benutzer auf eine neue URL in einem controller plugin, ohne wieder ein Antwort-Objekt an den controller?

Speziell möchte ich leiten den Benutzer auf die sichere version der aktuellen URL. So in ZF2 habe ich dieses:

$url = 'https://'.$this->getURL();

$response = $this->getController()->redirect()->toUrl( $url );

return $response;

Jedoch in das Zend Framework 1 war ich in der Lage zu tun:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');

$url = 'https://'.$this->getURL();

$redirector->gotoUrlAndExit($url);

Ist es möglich, im wesentlichen ‚redirect dann exit‘ in ZF2?

Ich merke, Sie haben wahrscheinlich Ihre Gründe dafür in der app, aber Sie sollten erwägen, die Behandlung dieses web-server-Ebene, und lassen Sie die app Agnostiker über die port/Protokoll.

InformationsquelleAutor Neil | 2012-11-08

2 Kommentare

  1. 4

    Vorausgesetzt, Sie sind die Erweiterung Zend\Mvc\Controller\Plugin\AbstractPlugin, dann sollten Sie umleiten können, wie diese:

    $this->getController()->plugin('redirect')->toUrl($url);
    return FALSE;

    Wenn man sich die Methode toUrl in Zend\Mvc\Controller\Plugin\Redirect, es sieht wie folgt aus:

    /**
     * Redirect to the given URL
     *
     * @param  string $url
     * @return Response
     */
    public function toUrl($url)
    {
        $response = $this->getResponse();
        $response->getHeaders()->addHeaderLine('Location', $url);
        $response->setStatusCode(302);
        return $response;
    }

    So offensichtlich, es ist Rücksendung der response-Objekt, aber es hat auch schon Hinzugefügt, den header, und aus dem controller Sie müssen nicht explizit die Antwort zurückgegeben, so dass Ihr plugin, sollten Sie nicht entweder. Ich denke, es wird allgemein getan, um eine fluent-Oberfläche, aber da Sie wissen Sie brauchen es nicht für irgendetwas anderes, werden Sie nicht brauchen, um es weiterzugeben zurück.

    Hinweis: ich habe nicht getestet in einem plugin, aber ich Tue dies innerhalb der controller und es funktioniert einwandfrei:

    $this->plugin('redirect')->toUrl($url);
    return FALSE;
    Sie sind richtig; einfach aufrufen, dass eventuell der Benutzer umgeleitet wird. Jedoch nicht, bis alles andere in den controller-Aktion ausgeführt wurde, einschließlich der view wird erzeugt und gesendet. Ich hatte gehofft, dass ich die Art und Weise der Rückkehr, die Antwort früher.
    Oh, ich verstehe, was Sie bekommen. Ich veränderte die plugin-Aufrufe in den obigen Beispielen mit return FALSE; die noch Umleitungen im Fall von der, die ich getestet in der Steuerung. Ich denke, es sollte die gleiche Arbeit in Ihrem plugin.
    Wenn Sie erwarten, zu tun, eine Menge von dieser, und finden es anstößig, FALSE zurückzugeben, Sie könnten erweitern die Redirect-plugin, und eine neue Methode, wie toUrlAndExit($url);, die genauso funktioniert wie die native toUrl($url) – Methode aber FALSE zurück, statt.
    Mein problem war, wenn ich FALSE zurück (wie in deinem Beispiel), es war die Rückgabe von FALSE der controller, nicht von der controller. Ich habe das Problem gelöst durch Rückgabe von NULL aus dem plugin, wenn Sie schon mit SSL, und das Response-Objekt aus toUrl (), wenn nicht. Dann im controller prüfe ich den Rückgabewert aus dem plugin, und wenn es ein Antwort-Objekt zurück. Ansonsten habe ich einfach weiter. Es ist nicht so aufgeräumt, wie ZF1 erlaubt, aber ich denke, diesen Weg bin ich mindestens verbleibenden wahrer zu ZF2-Modell.

    InformationsquelleAutor dualmon

Kostenlose Online-Tests