2017-02-02 16 views
1

У меня есть часть промежуточного программного обеспечения в Slim 3, которое проверяет сеанс для каждого маршрута. Если проверка не удалась, она возвращает объект JSON с { 'status' : false, 'error': 'failed validation' }. Если проверка прошла, она добавляет 'status' : true к объекту ответа JSON.Добавление статуса в PHP Slim 3 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" } }?

+0

Вы могли бы сделать что-то подобное в вашей Middleware '$ запросить = $ request-> withAttribute ("статус", правда); $ response = $ next ($ request, $ response); return $ response; ', а затем в вашем обратном вызове' $ status = $ request-> getAttribute ("status"); return $ response-> withJSON (['status' => $ status, 'data' => $ data]); 'или вы можете просто вернуть статус true по умолчанию, если он прошел Middleware –

+0

@DusanJovanov: какой вызов чтобы вернуть статус true по умолчанию в промежуточное ПО? –

+0

Нет, я имел в виду функцию обратного вызова в вашем маршруте, чтобы просто вернуть статус true по умолчанию, как этот '$ app-> get ('/ test', function ($ request, $ response, $ args) { $ data = [" foo "=>" bar "]; return $ response-> withJSON (['status' => true, 'data' => $ data]); });' –

ответ

0

Решение:

1) Ускоренное тела, как на обратной стороне промежуточного слоя курсор тела находится в конце потока

2) Декодирование Тело (перемотка назад сбрасывает курсор на голове сообщения)

3) мутировать Entity

4) Повторно вставьте Entity с withJson

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); 
});