<?php
namespace App\Listener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Psr\Log\LoggerInterface;
class ResponseListener
{
private $logger;
public function __construct( LoggerInterface $logger ) {
$this->logger = $logger;
}
// L'argument de la méthode est un FilterResponseEvent
public function processResponse(FilterResponseEvent $event)
{
// On teste si la requête est bien la requête principale (et non une sous-requête)
if (!$event->isMasterRequest()) {
return;
}
// On récupère la réponse que le gestionnaire a insérée dans l'évènement
$response = $event->getResponse();
$request = $event->getRequest();
// Utile quand on veut ecrire les erreurs en logs
// if ($response->getStatusCode() != 200 && $response->getStatusCode() != 201 && $response->getStatusCode() != 204) {
// if ($posts = $request->request->all()) {
// $this->logger->error(print_r($posts, true));
// }
// if ($gets = $request->query->all()) {
// $this->logger->error(print_r($gets, true));
// }
// $this->logger->critical(print_r($response->getContent(), true));
// }
//On vérifie que c'est bien une requête lié à l'api
if (strstr($request->getPathInfo(), 'api') == false) {
return;
}
//On vérifie que la contenu est bien de type json
if ($request->getRequestFormat() != 'json') {
return;
}
//get content
$content = $response->getContent();
$content = json_decode($content);
//add message if response has one
if (isset($content->message) && $content->message !== NULL && !is_object($content->message) && strlen($content->message) > 1) {
$message = $content->message;
unset($content->message);
}
//on vérifie que ce n'est pas une exception/erreur
if (isset($content->status) && $content->status == "error") {
return;
}
$status = 'success';
if ($response->getStatusCode() > 399) {
$status = 'error';
}
$newResp = array(
'status' => $status,
'status_code' => $response->getStatusCode(),
'status_text' => Response::$statusTexts[$response->getStatusCode()],
'content' => $content
);
if (isset($message)) {
$newResp['message'] = $message;
}
if ($response->getStatusCode() == 404) {
$newResp['message'] = "Introuvables";
}
$response->setContent(json_encode($newResp));
// Puis on insère la réponse modifiée dans l'évènement
$event->setResponse($response);
}
}