2010-11-25 6 views
1

In meinem Zend Framework-Projekt möchte ich prüfen, ob ein Cookie gesetzt ist. Wenn dies der Fall ist, möchte ich den Cookie-Inhalt verwenden, um einen Benutzer anzumelden.Zend: Führe etwas aus, bevor ein Controller ausgeführt wird

Da es für mich notwendig ist, diese automatische Anmeldung zu machen, bevor irgendein Controller aufgerufen wird, habe ich versucht, es in den Bootstrap zu legen. Dort möchte ich die Datenbank überprüfen, ob die Benutzerinformationen gültig sind. Leider ist der Standard-Datenbankadapter zu diesem Zeitpunkt noch nicht initialisiert.

Also meine Frage ist die folgende: Wo setze ich die Sachen, die ausgeführt werden sollen, bevor ein Controller aufgerufen wird und nachdem alle Initialisierung/Bootstrapping Zeug getan ist?

Antwort

2

I'have keine große Erfahrung mit Zend Framework, aber ich denke, Sie sollten einen benutzerdefinierten generischen Controller zum Beispiel GenericController erstellen, die die Zend_Controller_Action und setzen Sie den Code in der preDispatch() Funktion erweitert. Alle Ihre Controller werden dann eine Unterklasse Ihres benutzerdefinierten Controllers, zum Beispiel:

class GenericController extends Zend_Controller_Action{ 
    function preDispatch(){ 
     parent::preDispatch(); 
     // put your code here 
    } 
} 
class FooController extends GenericController{ 
... 
} 
+0

toll, genau das was ich gesucht habe! – ralle

+2

Besserer Weg: Verwenden Sie [Zend_Controller_Plugins] (http://framework.zend.com/manual/en/zend.controller.plugins.html). Wenn Sie Ihre Controller erben, wird das Debugging und die Konfiguration je nach Bedarf wesentlich schwieriger. – breiti

0

Verwenden Sie die Methoden:

init() 
// and 
preDispatch() 

implementieren sie in Ihrer Klasse, init bei der Erstellung läuft, laufen preDispatch direkt vor Ihrer Aktionsmethode iirc

api

Auf dieser Seite, die ich darüber verknüpft Zustände

Hinweis: Verwendung von init() vs. preDispatch() Im vorherigen Abschnitt haben wir die Methode init() und in diesem Abschnitt die preDispatch() -Methode eingeführt. Was ist der Unterschied zwischen ihnen und welche Maßnahmen würden Sie in jedem ergreifen? Die Methode init() dient in erster Linie zur Erweiterung des Konstruktors. Normalerweise sollte Ihr Konstruktor einfach den Objektstatus festlegen und nicht viel Logik ausführen. Dies kann das Initialisieren von im Controller verwendeten Ressourcen (z. B. Modelle, Konfigurationsobjekte usw.) oder das Zuweisen von Werten umfassen, die vom Front-Controller, Bootstrap oder einer Registrierung abgerufen wurden. Die Methode preDispatch() kann auch verwendet werden, um einen Objekt- oder Umgebungsstatus (z. B. Ansicht, Aktionshelfer usw.) festzulegen, aber ihr primärer Zweck besteht darin, Entscheidungen darüber zu treffen, ob die angeforderte Aktion ausgelöst werden soll oder nicht. Wenn nicht, sollten Sie dann _forward() auf eine andere Aktion anwenden oder eine Ausnahme auslösen. Hinweis: _forward() wird nicht korrekt funktionieren, wenn es von init() ausgeführt wird, was eine Formalisierung der Intentionen der beiden Methoden ist.

+0

Aber ich möchte meinen Code ausführen, bevor ein Controller aufgerufen wird. Ich möchte den Benutzer anmelden, bevor Controller1 aufgerufen wird, aber auch bevor Controller2 aufgerufen wird. – ralle

+0

@ralle Für jede Anforderung wird immer ein Controller aufgerufen. Sie müssen sie auf jedem Controller anmelden, selbst wenn Sie wie in der anderen Antwort vorgeschlagen fortfahren, werden Sie immer noch diese Methoden einfügen. Es gibt KEINE (ohne Editieren Zend) globalen Speicherort (neben dem Bootstrap) Dies. Und wie du gesagt hast, da es die Benutzerauthentifizierung ist, ist es nicht einfach, den Bootstrap zu installieren. Obwohl Sie die DB im Bootstrap laden könnten, tun Sie dann die Authentifizierung. –

Verwandte Themen