我正在使用 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);