2010-11-10 85 views
1

我的應用程序中有一個非常標準的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被稱爲兩次?)

回答

1

如果你想早點做,我認爲你可以使用第一種方法(向插件傳遞一個異常數組)並在routeShutdown中測試模塊名或控制器名。

Personnaly我使用操作助手來檢查我的所有操作中的身份驗證。它更靈活,給我更多的控制權。這只是每個私人行爲的一條線。

請勿使用子級您的操作控制器。我在我的一個項目上做了這個,現在我的基類是一團糟。改用動作助手。

+1

你能否澄清「我的基礎班是POS」? – 2013-02-22 16:10:04

+1

方法太多,太麻煩 – Maxence 2013-02-23 07:44:38

0

有沒有辦法將插件連接到控制器有選擇地?

當然。如果請求中不包含您正在查找的參數,請不要註冊該插件。或者,假設所有頁面都受到保護,並且在init階段期間,那些不應受保護的頁面會在插件中調用某種方法。

如果你只想保護一個控制器,你可以反轉 - 只有在init階段調用某個方法時,插件纔會採取行動。

最後,您可以使頁面上的整個登錄部分爲自己的模塊,這將允許您在檢查憑據和重定向之前讓插件檢查該模塊。