Phalcon MVC调度程序 - 取消beforeDispatch中的操作

时间:2014-04-23 16:26:18

标签: php phalcon

匿名用户正在访问需要经过身份验证的用户的以下网址:/myprofile/settings。我希望能够中止MVC调度循环并将用户发送到登录位置。

代码:

$evt = $di->getShared('dispatcher')->getEventsManager();
$evt->attach('dispatch', new AccessControl\Security($di));

安全等级:

/**
 * This action is executed before execute any action in the application
 */
public function beforeDispatch(Event $event, Dispatcher $dispatcher)
{
    // User is not authenticated, access should be denied.
    $this->response->redirect('/signin');
}

问题。如何告知调度员跳过路由到myprofile Controller& settings操作而是转储响应(将重定向到/signin)。

$event->stop()无效。

谢谢!

3 个答案:

答案 0 :(得分:2)

以下是解决方案:

public function beforeDispatch(Event $event, Dispatcher $dispatcher)
{
    // User is not authenticated, access should be denied.
    $this->response->redirect('/signin');

    //Returning "false" we tell to the dispatcher to stop the current operation
    return false;
}

http://docs.phalconphp.com/en/latest/reference/tutorial-invo.html了解更多信息。

答案 1 :(得分:1)

为避免额外的往返重定向,您还可以将请求发送给您的登录操作。

此代码来自一个重度定制的应用程序,因此它可能无法为您开箱即用,但您会明白(它还会将请求的URL添加为调度程序参数,以便您可以在隐藏字段中输出它登录表单并在成功登录时重定向用户):

public function beforeDispatchLoop(Event $event, Dispatcher $dispatcher)
{
    if (! $this->auth->hasIdentity() && ! $this->auth->authenticateViaRememberMe()) {
        $dispatcher->setModuleName('login');
        $dispatcher->setControllerName('Login');
        $dispatcher->setActionName('login');
        $dispatcher->setNamespaceName('Login\Controller');
        $dispatcher->setParam('goto', ltrim($_SERVER["REQUEST_URI"], '/'));
        $this->view->setViewsDir($this->registry->directories->modules . 'Login/View');
        return $dispatcher->forward(array());
    }
}

答案 2 :(得分:0)

我来这里是为了寻找一个类似的问题,即返回错误不符合“ temuri”的建议。这是由于我在'dispatcher:beforeExecuteRoute'事件上有多个“侦听器”引起的。

该错误的已知位置:https://github.com/phalcon/cphalcon/issues/14675

要解决此问题,还可以调用$ event-> stop();。返回false即可解决此问题。