首页 > 解决方案 > laravel/lumen abort 继续中间件执行

问题描述

我有一个带有一些自定义中间件的路由,以及一个连接到该路由的控制器。

当我进入我的控制器时,我需要检查一个自定义对象(在请求中传递)以在需要时中止控制器操作。

public function myControllerFunction(Request $request){
...

    if(isset($data["data-key"])){
       abort(Response::HTTP_BAD_REQUEST, "custom abort message");
    }
...
//do other call

}

中止操作已启动,我在日志中看到它带有相应的消息但中间件继续执行并进入另一个错误(由于控制器中的中止,在调用另一个方法之前中断)。因此,初始响应错误消息被覆盖。

我的目标是停止我的代码在控制器中运行,并停止设置为“之后”的中间件执行。我预计中止会取消所有代码执行。

我尝试了 athrow Exception(…)但结果是一样的,自定义异常没有任何成功。我还尝试在中间件中使用“时髦风格”代码(我在其中检查请求中是否已经存在错误消息或异常),但在此位置制作它是不正确的。

为什么中止不取消代码执行?


有关更多信息,我的路由器如下所示:

$router->post(
      'path',
       [
          'as' => 'element.functionName',
          'uses'=>'ElementResourceController@myControllerFunction',
          'middleware' => [
             'middleware-before-1',
             'middleware-before-2',
             'middleware-before-3',
             'middleware-after-1',
             'middleware-after-2',
             'middleware-after-3'
          ],
       ]
 );

我之前的中间件看起来像这样

public function handle(Request $request, Closure $next){

    // do things
    if(this){
        //do that
    }

    return $next($request);
}

我的中间件

public function handle(Request $request, Closure $next){
    $resp = $next($request);
    ///do things

    //other error at this line, because abort in controller did not work as expected
    //this middleware should not be executed
    $element = Element::findOrFail($resp->getData()->key); 

    return $resp;
}

标签: laravelexceptionmiddlewarelumenabort

解决方案


推荐阅读