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