簡體   English   中英

我如何在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();
}

所以我的問題確實包含兩個部分:

  1. 存儲將在多個控制器中使用的代碼的最佳位置在哪里?
  2. 然后如何從控制器調用該函數?

謝謝。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM