2017-02-02 5 views
1

Ich habe ein Stück Middleware in Slim 3, die eine Sitzung für jede Route validiert. Wenn die Validierung fehlschlägt, wird ein JSON-Objekt mit { 'status' : false, 'error': 'failed validation' } zurückgegeben. Wenn die Validierung erfolgreich ist, fügt sie dem Antwort-JSON-Objekt 'status' : true hinzu.Hinzufügen eines Status zu PHP Slim 3 Antwort

Wie füge ich eine Objekteigenschaft in die $ Antwort ein?

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

Wie kann ich die Middleware-Funktion verändern, so dass ich { "status" : true, "data" : { "foo" : "bar" } } bekommen?

+0

Sie könnten etwas tun, wie dies in der Middleware '$ anfordern = $ request-> withAttribute ("status", true); $ response = $ next ($ Anfrage, $ Antwort); return $ response; 'und dann in Ihrem Route-Callback' $ status = $ request-> getAttribute ("status"); return $ response-> withJSON (['status' => $ status, 'data' => $ data]); 'oder Sie könnten einfach den Status true zurückgeben, wenn die Middleware –

+0

@DusanJovanov: What's the call bestanden hat um den Status in der Middleware standardmäßig als "true" zurückzusetzen? –

+0

Nein, ich habe in Ihrer Route Callback-Funktion gemeint, um standardmäßig den Status 'true' zurückzuliefern wie $ app-> get ('/ test', Funktion ($ request, $ response, $ args)) { $ data = ["foo "=>" bar "]; return $ response-> withJSON (['status' => true, 'daten' => $ data]); });' –

Antwort

0

Lösung:

1) den Körperrücklauf, wie auf der Rückseite der Middleware der Cursor des Körpers am Ende des Stroms ist

2) Decode des Körpers (rewind setzt den Cursor auf den Kopf der Nachricht)

3) das mutieren Entity

4) wieder einsetzen Entity mit withJson

Zurück

5) die neue JSON-Antwort

Beispielcode:

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