laravel - 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;
}
解决方案
推荐阅读
- python - 使用 Python 发送的 WhatsApp 消息中的换行符
- regex - VSCode 在片段中链接正则表达式转换
- java - Karaf:连接被拒绝(公司代理,但代理在 Karaf/Maven 中正确配置)
- python-3.x - 如何防止 Tkinter 从属小部件指示自己的位置?
- python - 不和谐授权申请
- c++ - std::unordered_map 无法使用 std::map 成功的父类型编译
- objectmapper - jackson 中的 ObjectMapper 错误(消息:没有从字符串值反序列化的字符串参数构造函数/工厂方法)
- java - SpringBoot - 关系的实体传播
- c# - 来自键盘 Unity 的 CZ 字符
- java - Android 无法使用自定义样式在微调器中居中文本