![](/img/trans.png)
[英]How do I reuse and override controller actions across two modules in Zend Framework
[英]How do I reuse code in Zend Framework
我正在開發一個Web應用程序,該應用程序要求用戶先登錄才能看到或執行任何操作。 如果未登錄,則無法訪問該應用程序的任何部分。(當然,登錄控制器除外)
當前,我正在使用會話來處理身份驗證,並且已將代碼放在init()函數的每個控制器中,以檢查其會話是否有效。
這是暫時的解決方法,但它是多余的且效率低下。
我希望我的init()函數類似於以下內容,但是我不確定如何實現:
public function init()
{
// If user not logged in redirect to login controller
$myLibrary = Zend_Library_MyLibrary();
$myLibrary->CheckAuth();
}
所以我的問題確實包含兩個部分:
謝謝。
http://zendframework.com/manual/en/zend.controller.plugins.html
注冊前端控制器插件並連接到調度過程的較早部分是我的方法。
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_AuthCheck());
將其放在您的index.php中。
class AuthCheck extends Zend_Controller_Plugin_Abstract {
public function preDispatch($request){
// Check Auth
}
}
最好將跨多個控制器重用的代碼放入ActionHelper中 。 但是,對於您的情況,我建議編寫一個Controller插件 。 這些在各個階段都參與了Dispatch流程 :
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
if(!Zend_Auth::getInstance()->hasIdentity())
{
$request->setControllerName('auth');
$request->setActionName('login');
// Set the module if you need to as well.
}
}
以上假設您正在使用Zend_Auth
來驗證和管理用戶身份 。
您需要一個通過助手的插件,因為檢查用戶是否已登錄應該自動進行,而無需在某個地方調用checkAuth()
方法。 當然,也沒有什么可以阻止您添加ActionHelper的,例如
class My_Helper_CheckAuth extends Zend_Controller_Action_Helper_Abstract
{
public function checkAuth()
{
return Zend_Auth::getInstance()->hasIdentity();
}
public function direct()
{
return $this->checkAuth();
}
}
在引導程序中注冊了助手之后,可以在每個控制器中使用它來檢查用戶是否已通過身份驗證:
if ( $this->_helper->checkAuth() === FALSE) {
// do something
}
另請參閱以下教程:
雖然,對於這個特定示例,最好的選擇是(可能)使用前端控制器插件,但是您也可以通過擴展Zend_Controller_Action
來重用代碼。 如果您一直在使用Zend_Auth,則下面是一個人為的示例。 這將在library/Application/Controller
並命名為Action.php
。 如果您使用其他名稱空間,則應交換該應用程序目錄的名稱(庫/ [名稱空間] /Controller/Action.php),並相應地重命名該類。
class Application_Controller_Action extends Zend_Controller_Action
{
protected $_loggedIn;
protected $_username;
protected $_flashMessenger = null;
public function init()
{
$auth = Zend_Auth::getInstance();
$this->_loggedIn = $auth->hasIdentity();
if($this->_loggedIn)
{
$user = $auth->getIdentity();
$this->_username = $this->view->escape($user->username);
}
$this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
$this->initView();
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.