向PHP Slim 3响应添加状态

向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

我在Slim 3中有一个中间件,用于验证每个路由的会话。如果验证失败,它将返回一个JSON对象,其中包含
{'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]);});
啊,对不起,我读错了。我正在寻找一种方法,从中间件中注入属性……似乎应该有一种方法可以做到这一点,这就是中间件的目的。