从zend中的onBootStrap()返回

时间:2014-01-03 08:33:23

标签: php zend-framework zend-framework2 bootstrapping

我从onBootStrap()调用一个函数来授权用户,在该函数中我使用头信息来验证用户。

如果这不正确,我想在此处停止执行(onBootStrap()),甚至不调用实际的API并向用户返回一些响应。

用户应该得到一些回复,因为只有用户才能知道问题是什么。

我如何从那里回复回应?

1 个答案:

答案 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),这样您就可以在用户授权之前挂钩此事件。