我的應用程序中有一個非常標準的ACL系統。如果用戶未被授權,有一個登錄控制器和一堆其他控制器重定向回登錄。我使用控制器插件來檢查ID和重定向,我顯然不希望登錄控制器和錯誤控制器執行這樣的重定向。Zend控制器插件和子類動作控制器
現在我已經多次讀過使用控制器插件比子類化動作控制器更好的做法。然而,我所看到的是,從這個抽象基本控制器類中擴展所有控制器要容易得多,它在init方法中執行必要的檢查,除了直接擴展Zend_Controller_Action的Login控制器。
所以問題是,有沒有辦法將插件連接到控制器有選擇地?當然,我總是可以使一個數組出一定的控制器,它通過一個setter方法發送到插件,這樣做:
$controller = $request->getParam('controller');
if (count($this->exceptions))
if (in_array($controller, $this->exceptions)) return;
//...check ID, perform redirect, etc...
丈二和尚告訴我這是不是做的最好辦法。
和建議?
編輯1:@Billy奧尼爾
謝謝您的回覆,但我不太明白。我可以做
public function init()
{
$this->getRequest()->setParam('dropProtection', true);
}
(或運行一些設置插件的一些私有變量法)在我登錄控制器,然後說,如果「dropProtection」是不是真的那麼檢查用戶ID。但實際調度過程是這樣的:
Plugin::dispatchLoopStartup
Plugin::preDispatch
Controller::init
Plugin::postDispatch
Plugin::preDispatch
Plugin::postDispatch
Plugin::dispatchLoopShutdown
所以我不能比插件檢查這個「dropProtection」 PARAM較早::執行postDispatch,這是一個有點晚了。 (順便說一下,爲什麼preDispatch和postDispatch被稱爲兩次?)
你能否澄清「我的基礎班是POS」? – 2013-02-22 16:10:04
方法太多,太麻煩 – Maxence 2013-02-23 07:44:38