向PHP Slim 3响应添加状态
我在Slim 3中有一个中间件,用于验证每个路由的会话。如果验证失败,它将返回一个JSON对象,其中包含向PHP Slim 3响应添加状态,php,json,routing,slim,middleware,Php,Json,Routing,Slim,Middleware,我在Slim 3中有一个中间件,用于验证每个路由的会话。如果验证失败,它将返回一个JSON对象,其中包含{'status':false,'error':'failed validation'}。如果验证通过,它会向响应JSON对象添加“状态”:true 如何在$response中插入对象属性 $app->add(function($request, $response, $next) { $valid = doExternalValidation(); if ($valid
{'status':false,'error':'failed validation'}
。如果验证通过,它会向响应JSON对象添加“状态”:true
如何在$response中插入对象属性
$app->add(function($request, $response, $next) {
$valid = doExternalValidation();
if ($valid == false) {
return $response->withJSON(
[ 'status' => false, 'errors' => 'failed validation' ]
);
}
$response = $next($request, $response);
$response->jsonBody['status'] = true; // THIS IS WHAT I WANT TO DO
return $response;
});
$app->get('/test', function ($request, $response, $args) {
$data = [ "foo" => "bar" ];
return $response->withJSON([ 'data' => $data ]);
});
如何更改中间件功能,以便获得
{“status”:true,“data”:{“foo”:“bar”}
?解决方案:
$app->add(function($request, $response, $next) {
$valid = doExternalValidation();
if ($valid == false) {
return $response->withJSON(
[ 'status' => false, 'errors' => 'failed validation' ]
);
}
$response = $next($request, $response);
$response->getBody()->rewind();
$object = json_decode($response->getBody());
$object['status'] = true;
return $response->withJson($object);
});
1) 倒带主体,因为在中间件的背面,主体的光标位于流的末尾
2) 解码正文(倒带将光标重置为消息的标题)
3) 变异实体
4) 使用JSON重新插入实体
5) 返回新的Json响应
示例代码:
$app->add(function($request, $response, $next) {
$valid = doExternalValidation();
if ($valid == false) {
return $response->withJSON(
[ 'status' => false, 'errors' => 'failed validation' ]
);
}
$response = $next($request, $response);
$response->getBody()->rewind();
$object = json_decode($response->getBody());
$object['status'] = true;
return $response->withJson($object);
});
您可以在中间件中执行类似的操作$request=$request->withAttribute(“status”,true)$响应=$next($request,$response);返回$response然后在路由回调中$status=$request->getAttribute(“status”);返回$response->withJSON(['status'=>$status,'data'=>$data])代码>或者,如果状态已通过测试,则可以在默认情况下返回状态trueMiddleware@DusanJovanov:在中间件中,使状态默认返回true的调用是什么?不,我的意思是在路由回调函数中,仅在默认情况下返回状态true,如下所示$app->get('/test',function($request,$response,$args){$data=[“foo”=>“bar”];return$response->withJSON(['status'=>true,'data'=>$data]);});
啊,对不起,我读错了。我正在寻找一种方法,从中间件中注入属性……似乎应该有一种方法可以做到这一点,这就是中间件的目的。