<?php
namespace App\Utils;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\Serializer;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
trait ResponseTrait
{
/** @var Serializer */
private $serializer;
protected $context;
public function __construct(ContainerInterface $container)
{
$this->serializer = $container->get('jms_serializer');
}
public function setContext($groups)
{
$this->context = new SerializationContext();
$this->context->setGroups($groups);
}
private function getResponse($json, $httpCode)
{
return Response::create(
$json,
$httpCode,
[
'Content-Type' => 'application/json',
]
);
}
private function failedResult($message = null, $code = null, $httpCode = null, $addFields = [])
{
$responseData = [
'success' => false,
'error' => $code ?: Response::HTTP_NOT_FOUND,
'error_description' => $message,
];
if(sizeof($addFields))
foreach($addFields as $k => $v)
$responseData[$k] = $v;
$json = $this->serializer->serialize(
$responseData,
'json'
);
return $this->getResponse($json, $httpCode);
}
private function successResult($message = null, $code = null, $data = null, $httpCode = null)
{
$json = $this->serializer->serialize(
[
'success' => true,
'code' => $code,
'message' => $message,
'data' => $data,
],
'json',
$this->context
);
return $this->getResponse($json, $httpCode);
}
public function statusNotFound($error = null, $code = null)
{
return $this->failedResult($error, $code, Response::HTTP_NOT_FOUND);
}
public function statusAccessDenied(
$message = 'You have no permission for this action.',
$code = JsonResponse::HTTP_FORBIDDEN
) {
return $this->failedResult($message, $code, Response::HTTP_FORBIDDEN);
}
public function statusNotAuthorized($message = 'You are not authorized')
{
return $this->failedResult($message, Response::HTTP_UNAUTHORIZED, Response::HTTP_UNAUTHORIZED);
}
public function statusOk($message = null, $code = null, $data = null)
{
return $this->successResult($message, $code, $data, Response::HTTP_OK);
}
public function statusCreated(
$message = null,
$code = null,
$data = null
) {
return $this->successResult($message, $code, $data, Response::HTTP_CREATED);
}
public function statusDeleted($message = null, $code = null)
{
return $this->successResult($message, $code, null, Response::HTTP_OK);
}
public function statusUnprocessedEntity($message = null, $code = null)
{
return $this->failedResult($message, $code, Response::HTTP_UNPROCESSABLE_ENTITY);
}
public function statusBadRequest($message = null, $code = null, $addFields = [])
{
return $this->failedResult($message, $code, Response::HTTP_BAD_REQUEST, $addFields);
}
public function statusConflict($message = null, $code = null, $addFields = [])
{
return $this->failedResult($message, $code, Response::HTTP_CONFLICT, $addFields);
}
}