J'ai un système ACL assez standard dans mon application. Un contrôleur de connexion et un tas d'autres contrôleurs redirigent vers la connexion si l'utilisateur n'est pas autorisé. J'utilise un Controller Plugin pour vérifier l'ID et la redirection et je ne veux évidemment pas que le contrôleur de connexion et le contrôleur d'erreur effectuent une telle redirection.Plugins Zend Controller vs contrôleur d'action sous-classe
Maintenant, j'ai lu plusieurs fois que l'utilisation de Controller Plugins est une meilleure pratique que de sous-classer le contrôleur d'action. Pourtant, ce que je vois est qu'il est beaucoup plus facile d'étendre tous mes contrôleurs de cette classe de contrôleur de base abstraite qui effectue la vérification nécessaire dans sa méthode init, sauf pour le contrôleur de connexion qui étend Zend_Controller_Action directement. Donc, la question est, y at-il un moyen d'attacher le plugin aux contrôleurs de manière sélective? Bien sûr, je peux toujours faire un tableau de certains contrôleurs, l'envoyer à un plug-in à travers une méthode setter et faire quelque chose comme:
$controller = $request->getParam('controller');
if (count($this->exceptions))
if (in_array($controller, $this->exceptions)) return;
//...check ID, perform redirect, etc...
Pourtant, quelque chose me dit que ce n'est pas la meilleure façon de le faire.
Et des conseils?
EDIT 1: @Billy ONeal
Merci pour votre réponse, mais je ne se coincent pas tout à fait. Je peux faire
public function init()
{
$this->getRequest()->setParam('dropProtection', true);
}
(ou exécuter une méthode qui définit une variable privée du plug-in) dans mon contrôleur de connexion, puis dire si « dropProtection » est pas vrai, alors vérifiez l'ID utilisateur. Mais le processus d'expédition réelle ressemble à ceci:
Plugin::dispatchLoopStartup
Plugin::preDispatch
Controller::init
Plugin::postDispatch
Plugin::preDispatch
Plugin::postDispatch
Plugin::dispatchLoopShutdown
donc je ne peux pas vérifier param « dropProtection » plus tôt que dans le plugin :: postDispatch et c'est un peu en retard. (en passant, pourquoi le preDispatch et postDispatch sont appelés deux fois?)
pouvez-vous clarifier "ma classe de base est un POS"? –
Trop de méthodes et trop encombrant – Maxence