繁体   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