Slim-修改中间件内部的POST请求正文

tsc*_*erg 6 rest jsonschema slim

我正在使用Justinrainbow的Slim v3json模式验证器作为我的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);
Run Code Online (Sandbox Code Playgroud)

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

tsc*_*erg 5

解决方案是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);
Run Code Online (Sandbox Code Playgroud)

就像我需要的那样,它使用修改后的对象完全覆盖了请求正文。您要注意的是:

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

希望该摘要对将来的用户有所帮助。