我从onBootStrap()调用一个函数来授权用户,在该函数中我使用头信息来验证用户。
如果这不正确,我想在此处停止执行(onBootStrap()),甚至不调用实际的API并向用户返回一些响应。
用户应该得到一些回复,因为只有用户才能知道问题是什么。
我如何从那里回复回应?
答案 0 :(得分:3)
简单地说,onBootstrap
是不够的。通常,您的应用程序中有两个阶段。第一个是自举,第二个是运行。在run
期间,您可以在引导过程中授权用户并返回响应,这是不可能的。
原因很简单,你可能有另一个模块覆盖它的行为。如果在模块后停止引导,则可以停止执行这些模块。最好将逻辑移到run
。此运行阶段由各种侦听器定义,其中第一个是route
。在bootstrap
之后和route
之前没有太多事情发生,所以就性能而言,它是可以忽略的。
代码示例:
use Zend\Mvc\MvcEvent;
use Zend\Json\Json;
class Module
{
public function onBootstrap($e)
{
$app = $e->getApplication();
$em = $app->getEventManager();
$em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($app) {
// your auth logic here
if (!$auth) {
$response = $e->getResponse();
$response->setStatusCode(403);
$response->setContent(Json::encode(array(
'error' => 12345,
'message' => 'You are not authorized for this request',
));
return $response;
}
}, PHP_INT_MAX);
}
}
侦听器在非常早的阶段(PHP_INT_MAX
)附加,因此检查在完整路由阶段首先发生。您也可以选择相当高的数字(例如1000
),这样您就可以在用户授权之前挂钩此事件。