2017-07-11 3 views
2

J'utilise Slim v3 et the json schema validator by justinrainbow pour mon API. Ce que je veux faire et je ne peux tout simplement pas me rendre au travail est:Slim - modifier le corps de la requête POST dans le middleware

  • dans le middleware: valider json entrant avec les valeurs par défaut. cela produit un objet modifié
  • écrire l'objet modifié dans la demande, de sorte qu'il peut être traité par les contrôleurs de base

Ce que je manquerais à est:

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

De ce point Sur, le corps de la demande est juste null. Qu'est-ce que je fais mal? Je suis plutôt certain qu'il y a quelque chose qui ne va pas dans la façon dont je modifie les objets Slim, parce que ça ne marche pas quand j'essaye aussi manuellement $request->getBody()->write('{"some": "content"}').

Répondre

1

la solution était 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); 

Il écrase complètement le corps de la requête avec l'objet modifié, comme je le souhaitais. Ce que vous devez payer à l'esprit:

  • A partir de là, la demande tiendra un objet analysé comme corps et à appeler $request->getParsedBody() il ne sera pas être parsé à nouveau, si je comprends bien la source correctement
  • à appeler $request->getParsedBody() vous obtenez généralement un tableau associatif si le corps était JSON, mais en utilisant l'extrait ci-dessus, le corps analysé sera un objet à la place.

L'extrait peut être utile aux utilisateurs dans le futur.

0

code Vous remplace le corps de la demande avec les nouvelles données, Vous devez créer une nouvelle demande Contenir le corps précédent avec les nouvelles données

Vous pouvez utiliser méthode withAttribute pour passer des paramètres aux routes internes former le middleware code Vous sera comme ça

# 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); 
+0

Remplacer le corps de la requête par les nouvelles données est exactement ce que je dois faire. Problème: Il ne fait pas cela, il définit simplement le corps à 'null' – tscherg

+0

Ainsi, vous pouvez utiliser withAttribute pour envoyer des paramètres –

+0

Cela n'a pas fonctionné du tout; La définition des attributs ne semble pas modifier le corps de la requête – tscherg