我已经使用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都很陌生。
提前感谢您的帮助。
答案 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
事件,据我所知,在收到请求之后但在实际处理路由之前,会触发该事件。如果验证条件失败,请求将被重定向到另一个路由,否则允许请求进入预期路由。