Zend Framework重复功能

时间:2012-02-03 09:19:13

标签: php zend-framework

我最近开始使用Zend Framework,我完全爱上了它,我甚至退出了​​我自己的框架,支持它。

但是我错过了一些可能非常痛苦的东西,你会轻笑一下。

我有一个登录系统,在每个控制器中我必须检查登录状态,我看看在Bootstrap中访问Zend会话存储但是我有点截止日期并且买不起浪费时间,是否有更好的方法来检查引导程序中的IE?而不是在每个控制器中重复20行以上的代码和功能。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以使用控制器插件。请参阅:http://framework.zend.com/manual/en/zend.controller.plugins.html

class Your_Plugin_Login extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        if (!Zend_Auth::getInstance()->hasIdentity()) {
            // send the user to the login page
            $request->setControllerName('login')
                    ->setActionName('login');
        }
    }
}

将控制器/操作名称替换为适合您的登录页面的内容,将“Your”替换为您的应用程序命名空间。

然后,您可以在application.ini或带有Zend_Controller_Front::getInstance()->registerPlugin(new Your_Plugin_Login());的引导程序中使用Front控制器注册插件。

修改:如果您还想在视图中添加用户详细信息,您可以执行以下操作:

$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->user = Zend_Auth::getIdentity();

答案 1 :(得分:1)

你可以编写自己的继承自Zend Controller的控制器(称之为DaveMac_Controller - 你可以在应用程序的配置文件中定义前缀,以便应用程序可以自动加载它(你需要小心保存你的目录)上课))。在此类的构造函数中运行检查以进行身份​​验证。然后将所有页面的控制器更改为继承自DaveMac_Controller而不是默认的zend控制器。

如果我在家,我可以复制并粘贴一些代码作为示例,但现在正在工作,所以希望上面的大纲就足够了。

*编辑好的'dropbox:)

的application.ini

includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces[] = "DaveMac_"

/../库/ DaveMac /控制器/ action.php的

<?php 

class DaveMac_Controller_Action extends Zend_Controller_Action {


    protected $acl;
    protected $user;
    protected $userRole;

    public function init() {

        //retrieve and store user details
        $auth = Zend_Auth::getInstance(); 
        if($auth->hasIdentity()){
            $user = $auth->getIdentity();
            $this->user = $user;
            $this->view->user = $user;
            $this->userRole = $user->role;
        } else {
            $this->userRole = "guest";
        }

        //Initialise access control list
        $this->acl = new DaveMac_Acl();
    }

    protected function checkAuth($pageLevel, $redirect = "/") {
        if($this->user) {
            if(!$this->acl->isAllowed($this->userRole, $pageLevel)) {
                $this->_redirect($redirect);
            }
    } else if ($pageLevel != DaveMac_Resources::PUBLIC_ONLY_PAGE) {
        $this->_redirect('/login/returnurl/' . str_replace('/','-',$this->getRequest()->getRequestUri()));
        }
    }
}

你可能已经有了自己的功能来检查身份验证,但我还是认为我会离开我的