苗条 - 修改中间件内的 POST 请求正文



我正在使用 Slim v3 和 justinrainbow 的 json 模式验证器作为我的 API。我想做的,只是无法开始工作是:

  • 在中间件中:使用默认值验证传入的 JSON。 这将生成一个修改后的对象
  • 将修改后的对象写回请求中,以便核心控制器可以对其进行处理

我失败的是:

# inside middleware:
$requestbody = $request->getBody();
$requestobject = json_decode($requestbody);
# validation and modification of $requestobject takes place here
$request->getBody()->write(json_encode($requestobject));
$request->reparseBody();
return $next($request, $response);

从那时起,请求正文就null了。我做错了什么?我相当确定我修改 Slim 对象的方式有问题,因为当我手动尝试$request->getBody()->write('{"some": "content"}')时它也不起作用。

解决方案withParsedBody()

# inside middleware:
$requestbody = $request->getBody();
$requestobject = json_decode($requestbody);
# validation and modification of $requestobject takes place here
$request = $request->withParsedBody($requestobject);
return $next($request, $response);

正如我需要的那样,它用修改后的对象完全覆盖请求正文。您必须注意的事项:

  • 从那里开始,请求将保存一个解析的对象作为主体,并且在调用$request->getParsedBody()时,如果我正确理解源代码,它不会被重新解析
  • 在调用$request->getParsedBody()时,如果主体是 JSON,您通常会得到一个关联数组,但使用上面的代码段,解析的主体将是一个对象。

愿该代码段将来对用户有所帮助。

您的代码将请求的正文替换为新数据, 您必须创建一个新请求 用新数据包含以前的正文

您可以使用withAttribute方法将参数传递给中间件的内部路由 你的代码会是这样的

# inside middleware:
$requestbody = $request->getBody();
$requestobject = json_decode($requestbody);
# validation and modification of $requestobject takes place here
$request=$request->withAttribute(Your Key-Values parms );
return $next($request, $response);

最新更新