Zend Framework在引导程序中的当前路由

时间:2012-03-07 20:24:08

标签: php zend-framework

女士们,先生们,

我正在努力开发基于Zend Framework的新Web应用程序。 几乎整个Web应用程序都将通过登录(用户名和密码)进行保护。

我的想法是检查访问者是否可以进行身份​​验证,如果没有检查用户是否正在请求登录路由。如果他没有尝试登录,他将被重定向到登录页面。

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{  
    /**
     * Bootstrap::_initRouterRewrites()
     * 
     * @return void
     */
    protected function _initRouterRewrites()
    {
        $frontController  = Zend_Controller_Front::getInstance();
        $this->router = $frontController->getRouter();

        $this->router->addRoute(
            'default',
            new Zend_Controller_Router_Route('/',
                                            array('controller' => 'index',
                                                  'action' => 'index'))
                     )
                     ->addRoute(
            'login',
            new Zend_Controller_Router_Route('/inloggen.html',
                                            array('controller' => 'auth',
                                                  'action' => 'login'))
        ); 
    }

    /**
     * Bootstrap::_initZendSession()
     * 
     * @return void
     */
    protected function _initZendSession()
    {
        // Ensure that both the session and the db resources are bootstrapped
        $this->bootstrap(array('db', 'session'));

        // Actually start the session
        Zend_Session::start();
    }

    /**
     * Bootstrap::_initAuthentication()
     * 
     * @return void
     */
    protected function _initAuthentication()
    {
        // Instantiate auth object
        $auth = Zend_Auth::getInstance();

        // Check if visitor has an identity
        if (!$auth->hasIdentity())
        {

        }
    }
}

当我在_initAuthentication方法中使用方法$ this-&gt; router-&gt; getCurrrentRoute()时,我收到以下错误:“当前路线未定义”。

如何检查当前路线是否登录?

提前致谢!

2 个答案:

答案 0 :(得分:4)

在引导路由时,路由已经运行。您需要的是FrontController Plugin,它在适当的位置挂钩请求生命周期。在你的情况下,在路由确定了发送请求的位置后,可能会在routeShutdown期间。

来自http://devzone.zend.com/1692/zend-framework-mvc-request-lifecycle/

enter image description here

答案 1 :(得分:0)

在bootstrap.php中使用这样的插件:     protected function _initPlugins() { $front = Zend_Controller_Front::getInstance(); $front->registerPlugin(new Plugin_Checkaccess()); }

并在plugins / Checkaccess.php中    `

public function preDispatch(Zend_Controller_Request_Abstract $request)
{ 

    $request = $this->getRequest();
            $controllerName = strtolower($request->getControllerName());
            $actionName = strtolower($request->getActionName());

            if ('user' == $controllerName)
    {
                $session = new Zend_Session_Namespace('USER');

                $notLogged = array('login','register');

                if(!in_array($actionName, $notLogged) && !$session->user){
                    $request->setControllerName("index");
                    $request->setActionName("index");
                    $this->_response->setRedirect('/');
                    //$this->_response->setRedirect('/?redirectTo='.$this->_request->getRequestUri());
                }elseif(in_array($actionName, $notLogged) && $session->user){
                    $request->setControllerName("user");
                    $request->setActionName("index");
                    $this->_response->setRedirect('/home');
                }
                return;
    }

} }`