如何让ZF2 Web服务在路由匹配上运行一个函数

时间:2014-06-04 21:03:30

标签: php zend-framework2

我已经使用ZF2设置了一个REST Web服务,我想要做的是在实际运行与匹配的路由相关联的操作之前,让我的Web服务调用一个干预功能。

更具体一点,但我想做的是,无论何时路由与我的模块匹配,都要有一个检查请求头中的值的函数运行,然后允许调用该行为或者返回错误代码。

例如,如果我的module.config.php中有以下路线:

'TestCall' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/Rest/TestCall[/]',
        'defaults' => array(
            'controller' => 'Rest\Controller\Rest',
            'action' => 'TestCall',
        ),
    ),
),

然后,在RestController.php我有以下内容:

public function TestCallAction()
{
    return new JsonModel(array("I worked!"));
}

每当路线TestCall匹配时,我想,在行动被解雇之前,触发以下内容:

public function FireCheck()
{
    if ($this->getRequest()->getHeaders()->get('customheadervalue')->getFieldValue() == 'bananas')
    {
        //now fire the actual action
    }
    else
    {
        $this->getResponse()->setStatusCode(403);
        return new JsonModel(array("Nope, not allowed!"));
    }
}

这可能吗?有什么方法可以实现这个目标吗?我对Zend Framework和PHP都很陌生。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

为了记录,我设法使用here找到的信息完成了。

我所做的是将以下内容添加到我的控制器中:

public function setEventManager(EventManagerInterface $events)
{
    parent::setEventManager($events);
    $controller = $this;
    $events->attach('dispatch', function ($e) use ($controller) {
        $request = $e->getRequest();
        $token = $request->getHeaders()->get('accesstoken')->getFieldValue();        

        if (!$token == "allowed")
        {
            return $controller->redirect()->toRoute('AccessDenied');
        }

        return;
    }, 100);
}

除了将此use语句添加到我的控制器:

use Zend\EventManager\EventManagerInterface;

这是一个函数绑定到dispatch事件,据我所知,在收到请求之后但在实际处理路由之前,会触发该事件。如果验证条件失败,请求将被重定向到另一个路由,否则允许请求进入预期路由。