我正在使用Slim v3和the json schema validator by justinrainbow作为我的API。我想要做的只是不能上班的是:
我失败的是:
# 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"}')
时它不起作用。
答案 0 :(得分:4)
解决方案是 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,你通常会得到一个关联数组,但是使用上面的代码片段,解析后的正文将成为一个对象。该片段可能会在将来对用户有所帮助。
答案 1 :(得分:0)
您的代码用新数据替换请求的主体, 您必须创建一个新请求包含具有新数据的上一个正文
您可以使用 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);