2010-11-25 33 views
1

Dans mon projet d'infrastructure Zend, je souhaite vérifier si un cookie est défini. Si c'est le cas, je veux utiliser le contenu des cookies pour se connecter à un utilisateur.Zend: Exécuter quelque chose avant l'exécution d'un contrôleur

Puisqu'il est nécessaire pour moi de faire cette connexion automatique avant que n'importe quel contrôleur soit appelé, j'ai essayé de le mettre dans le Bootstrap. Là, je veux vérifier la base de données si les informations de l'utilisateur est valide. Malheureusement, à ce stade, l'adaptateur de base de données par défaut n'est pas encore initialisé. Donc ma question est la suivante: Où est-ce que je mets ces choses qui devraient être exécutées avant que n'importe quel contrôleur soit appelé et après que tout l'initialisation/l'amorçage soit fait?

Répondre

2

I'have pas une grande expérience avec Zend Framework mais je pense que vous devez créer un contrôleur générique sur mesure par exemple GenericController qui étend la Zend_Controller_Action et de mettre votre code dans la fonction preDispatch(). Tous vos contrôleurs seront alors une sous-classe de votre contrôleur personnalisé, par exemple:

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

super, exactement ce que je cherchais! – ralle

+2

Mieux: utilisez [Zend_Controller_Plugins] (http://framework.zend.com/manual/fr/zend.controller.plugins.html). L'héritage de vos contrôleurs rend le débogage et la configuration beaucoup plus difficiles au besoin. – breiti

0

Utilisez les méthodes:

init() 
// and 
preDispatch() 

les mettre en œuvre dans votre classe, init exécute à la création, preDispatch passe juste avant votre méthode d'action IIRC

api

Sur cette page I lié au-dessus états

Note: Utilisation de init() par rapport à preDispatch() Dans la section précédente, nous avons introduit la méthode init(), et dans cette section, la méthode preDispatch(). Quelle est la différence entre eux, et quelles actions prendriez-vous dans chacun? La méthode init() est principalement destinée à étendre le constructeur. En règle générale, votre constructeur doit simplement définir l'état de l'objet et ne pas effectuer beaucoup de logique. Cela peut inclure l'initialisation de ressources utilisées dans le contrôleur (telles que des modèles, des objets de configuration, etc.) ou l'affectation de valeurs extraites du contrôleur frontal, de l'amorce ou d'un registre. La méthode preDispatch() peut également être utilisée pour définir un état d'objet ou environnemental (par exemple, vue, aide d'action, etc.), mais son but principal est de décider si l'action demandée doit être distribuée ou non. Sinon, vous devriez alors _forward() à une autre action, ou lancer une exception. Note: _forward() ne fonctionnera pas correctement lorsqu'il est exécuté depuis init(), ce qui est une formalisation des intentions des deux méthodes.

+0

Mais je veux exécuter mon code avant l'appel d'un contrôleur. Je veux me connecter à l'utilisateur avant l'appel de Controller1 mais aussi avant l'appel de Controller2. – ralle

+0

@ralle Un contrôleur de quelque sorte est toujours appelé pour chaque requête. Vous devrez vous connecter sur chaque contrôleur, même si vous étendez comme suggéré dans l'autre réponse que vous allez toujours mettre ces méthodes po Il n'y a pas de localisation globale (sans modifier Zend) (sauf bootstrap) pour faire ce. Et comme vous l'avez dit puisque c'est l'authentification de l'utilisateur, mettre int bootstrap n'est pas le plus facile. Bien que vous puissiez charger la base de données dans le bootstrap ALORS faites l'authentification. –