Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 使用Dispatch事件检查授权_Zend Framework2 - Fatal编程技术网

Zend framework2 使用Dispatch事件检查授权

Zend framework2 使用Dispatch事件检查授权,zend-framework2,Zend Framework2,我正在尝试设置一个简单的API。我有一个控制器,所有其他API控制器都在扩展,我还附加了一个调度侦听器,就像这样。我创建了一个总是失败的测试。将状态代码设置为401,然后返回消息。但是,它仍然在调用主控制器方法,并且没有放弃来自preDispatch方法的请求。我可以在这里建立一个正确的响应并强制ZF2不继续执行请求的路由吗?我试图添加一个exit()语句,但客户端收到的响应不完整 protected function attachDefaultListeners() {

我正在尝试设置一个简单的API。我有一个控制器,所有其他API控制器都在扩展,我还附加了一个调度侦听器,就像这样。我创建了一个总是失败的测试。将状态代码设置为401,然后返回消息。但是,它仍然在调用主控制器方法,并且没有放弃来自preDispatch方法的请求。我可以在这里建立一个正确的响应并强制ZF2不继续执行请求的路由吗?我试图添加一个
exit()
语句,但客户端收到的响应不完整

protected function attachDefaultListeners()
    {
        parent::attachDefaultListeners();
        $events = $this->getEventManager();
        $this->events->attach('dispatch', array($this, 'preDispatch'), 100);
        $this->events->attach('dispatch', array($this, 'postDispatch'), -100);
    }

    public function preDispatch (MvcEvent $e)
    {
        $this->dm = $this->getServiceLocator()->get('doctrine.documentmanager.odm_default');
        // TODO: Check user and token from DB
        if (Cookie::isCookieSet())
        {
            $cookie = Cookie::readCookie();
            if (empty($cookie->user))
            {
                $this->getResponse()->setStatusCode(401);
                return new JsonModel(array('auth' => false, 'msg' => 'Try again'));
            }
        // Cookie not set, if we are authenticating, continue; otherwise return a failure
        } else {

        }

    }

您需要返回一个响应对象来缩短流程,而不是ViewModel:

试着这样做:

$response = $this->getResponse();
$response->setStatusCode(401);
$response->setContent(array('auth' => false, 'msg' => 'Try again'));
return $response;