Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 如何通过事件结束操作的执行_Zend Framework2 - Fatal编程技术网

Zend framework2 如何通过事件结束操作的执行

Zend framework2 如何通过事件结束操作的执行,zend-framework2,Zend Framework2,在我的ZF2应用程序中,我添加了以下事件监听器,但是我想让操作的执行实际停止,但是这不会发生 public function setEventManager(EventManagerInterface $events) { parent::setEventManager($events); $controller = $this; $events->attach('dispatch', function ($e) use ($co

在我的ZF2应用程序中,我添加了以下事件监听器,但是我想让操作的执行实际停止,但是这不会发生

 public function setEventManager(EventManagerInterface $events)
    {
        parent::setEventManager($events);

        $controller = $this;
        $events->attach('dispatch', function ($e) use ($controller) {
            $request = $e->getRequest();
            $method = $request->getMethod();
            $headers = $request->getHeaders();

            // If we get here, based on some conditions, the original intended action must return a new JsonViewModel()...
            return new JsonViewModel([]); // However, this doesn't do anything.
        }, 100); // execute before executing action logic
    }

在您的活动中使用以下选项:

$e->stopPropagation();

在您的活动中使用以下选项:

$e->stopPropagation();

根据您的评论,我假设您正在进行某种身份验证。您可以完美地使用事件管理器进行此操作。但是,我不会将侦听器绑定到单个控制器。如果您的API增加,您可能希望将API拆分到多个控制器上,这样您的身份验证就会遇到麻烦

我的解决方案是创建一个侦听器,用于侦听Zend\Mvc\Application的分派事件。这是在控制器本身中的事件之前触发的事件

使用Zend\Mvc\MvcEvent;
引导上的公共函数(MvcEvent$e)
{
$app=$e->getApplication();
$em=$app->getEventManager();
$sm=$app->getServiceManager()->getSharedManager();
$listener=newlistener\Authentication();
$identifier='MyModule\Controller\ApiController';
$em->attach($identifier,MvcEvent::EVENT\u DISPATCH,$listener,1000);
}
这样,侦听器将连接到所有用
MyModule\Controller\ApiController
标识的控制器。侦听器将在这些控制器的每次调度调用时触发。您的侦听器可以在需要时短路整个调度循环:

使用Zend\Http\Request作为HttpRequest;
使用Zend\Mvc\MvcEvent;
使用Zend\Json\Json;
使用Zend\View\Model\JsonModel;
类身份验证
{
公共函数调用(MvcEvent$e)
{
$request=$e->getRequest();
if(!$request instanceof HttpRequest){
//不在CLI请求上运行
回来
}
如果($result->isValid()){
//假设您得到了验证结果,一切都正常
回来
}
//案例1:短路和返回响应,这是快速方式
//我在这里使用的响应是HTTP问题API
$message=数组(
“httpStatus”=>401,
“标题”=>“未经授权”,
“详细信息”=>“您无权执行此请求”,
);
$response=$e->getResponse();
$response->setStatusCode(401);
$response->getHeaders()->addHeaderLine('Content-Type','application/json');
$response->setContent(Json::encode($message);
返回$response;
//案例2:不要短路并停止传播,您正在使用JSON呈现程序
$e->getResponse()->setStatusCode(401);
$message=数组(
“httpStatus”=>401,
“标题”=>“未经授权”,
“详细信息”=>“您无权执行此请求”,
);
$model=newjsonmodel($message);
返回$model;
}
}
我建议您使用第一种方法(自己返回响应),因为这样会缩短整个分派过程,并跳过请求的完整完成。如果您确实依赖视图和响应发送者,请使用第二种情况

现在,如果您需要通过此系统进行身份验证的控制器,请将标识符添加到此控制器:

名称空间MyModule\Controller;
使用Zend\Mvc\Controller\AbstractActionController;
类MyFoobarapicController扩展AbstractActionController
{
受保护的$eventIdentifer='MyModule\Controller\ApicController';
//你的代码在这里
}
如果需要允许某些请求而不进行验证(我将始终使用白名单!),可以在侦听器中执行此操作:

使用Zend\Mvc\Route\RouteMatch;
$routematch=$e->getRouteMatch();
if(!$routematch的routematch实例){
//这是404,不要执行身份验证
回来
}
$route=$routematch->getMatchedRouteName();
如果(
($request->isPost()
||($request->isGet()&&“baz/bat”==$route)
) {
//我们允许这些请求在没有授权的情况下传递
回来
}

在您的代码中,您可以显式地检查请求方法和路由名称。如果您需要路由的参数,您可以使用
$routematch->getParam('id')访问它

根据您的评论,我假设您正在进行某种身份验证。您可以完美地使用事件管理器进行此操作。但是,我不会将侦听器绑定到单个控制器。如果您的API增加,您可能希望将API拆分到多个控制器上,您的身份验证会遇到问题

我的解决方案是创建一个侦听器,用于侦听Zend\Mvc\应用程序的分派事件。这是一个在控制器本身中的事件之前触发的事件

使用Zend\Mvc\MvcEvent;
引导上的公共函数(MvcEvent$e)
{
$app=$e->getApplication();
$em=$app->getEventManager();
$sm=$app->getServiceManager()->getSharedManager();
$listener=newlistener\Authentication();
$identifier='MyModule\Controller\ApiController';
$em->attach($identifier,MvcEvent::EVENT\u DISPATCH,$listener,1000);
}
这样,侦听器将连接到所有用
MyModule\Controller\ApiController
标识的控制器。这些控制器的每次调度调用都会触发侦听器。如果需要,您的侦听器可以使整个调度循环短路:

使用Zend\Http\Request作为HttpRequest;
使用Zend\Mvc\MvcEvent;
使用Zend\Json\Json;
使用Zend\View\Model\JsonModel;
类身份验证
{
公共函数调用(MvcEvent$e)
{
$request=$e->getRequest();
if(!$request instanceof HttpRequest){
//不在CLI请求上运行
回来
}
如果($result->isValid()){
//假设您得到了验证结果,一切都正常
回来
}
//案例1:短路和返回响应,这是快速wa