Test custom json response
This commit is contained in:
parent
87e29f23a0
commit
c1c45b9172
4 changed files with 103 additions and 3 deletions
94
src/Api/CustomJsonResponse.php
Normal file
94
src/Api/CustomJsonResponse.php
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
namespace EmotionHero\Api;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend JsonResponse to allow custom serialiser
|
||||||
|
*/
|
||||||
|
class CustomJsonResponse extends JsonResponse {
|
||||||
|
|
||||||
|
protected $serializer_callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param mixed $data The response data
|
||||||
|
* @param int $status The response status code
|
||||||
|
* @param array $headers An array of response headers
|
||||||
|
*/
|
||||||
|
public function __construct($data = null, $serializer_callback = null, $status = 200, $headers = array())
|
||||||
|
{
|
||||||
|
Response::__construct('', $status, $headers);
|
||||||
|
|
||||||
|
$this->serializer_callback = $serializer_callback == null ? [$this, 'serializeDefault'] : $serializer_callback;
|
||||||
|
|
||||||
|
if(!is_callable($this->serializer_callback)) {
|
||||||
|
throw new \RuntimeException("Invalid serializer callback provided", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $data) {
|
||||||
|
$data = new \ArrayObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setData($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static function create($data = null, $status = 200, $headers = array())
|
||||||
|
{
|
||||||
|
return new static($data, null, $status, $headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the data to be sent as JSON.
|
||||||
|
*
|
||||||
|
* @param mixed $data
|
||||||
|
*
|
||||||
|
* @return JsonResponse
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function setData($data = array())
|
||||||
|
{
|
||||||
|
$data = call_user_func($this->serializer_callback, $data);
|
||||||
|
|
||||||
|
$this->data = $data;
|
||||||
|
|
||||||
|
return $this->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set
|
||||||
|
* @param [type] $data [description]
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
public static function serializeDefault($data) {
|
||||||
|
if (defined('HHVM_VERSION')) {
|
||||||
|
// HHVM does not trigger any warnings and let exceptions
|
||||||
|
// thrown from a JsonSerializable object pass through.
|
||||||
|
// If only PHP did the same...
|
||||||
|
$data = json_encode($data, $this->encodingOptions);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
// PHP 5.4 and up wrap exceptions thrown by JsonSerializable
|
||||||
|
// objects in a new exception that needs to be removed.
|
||||||
|
// Fortunately, PHP 5.5 and up do not trigger any warning anymore.
|
||||||
|
$data = json_encode($data, $this->encodingOptions);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
if ('Exception' === get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
|
||||||
|
throw $e->getPrevious() ?: $e;
|
||||||
|
}
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_ERROR_NONE !== json_last_error()) {
|
||||||
|
throw new \InvalidArgumentException(json_last_error_msg());
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,8 +47,11 @@ class ScoreControllerProvider implements ControllerProviderInterface
|
||||||
|
|
||||||
$game = $request->attributes->get('game');
|
$game = $request->attributes->get('game');
|
||||||
|
|
||||||
return $app['serializer']->serialize($game, 'json');
|
if(empty($game)) {
|
||||||
|
return new CustomJsonResponse(['message' => 'Game not found'], $app['serializer.json'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CustomJsonResponse($game, $app['serializer.json']);
|
||||||
})
|
})
|
||||||
->bind('game')
|
->bind('game')
|
||||||
->convert('game', function($game, Request $request) use ($app){ return $app['entity.manager']->getRepository(Models\Game::class)->find($request->attributes->get('gameId'));});
|
->convert('game', function($game, Request $request) use ($app){ return $app['entity.manager']->getRepository(Models\Game::class)->find($request->attributes->get('gameId'));});
|
||||||
|
|
|
@ -42,6 +42,9 @@ $app['users'] = function () use ($eh) {
|
||||||
$app['serializer'] = function () use ($eh) {
|
$app['serializer'] = function () use ($eh) {
|
||||||
return JMS\Serializer\SerializerBuilder::create()->build();
|
return JMS\Serializer\SerializerBuilder::create()->build();
|
||||||
};
|
};
|
||||||
|
$app['serializer.json'] = function ($data) use ($app) {
|
||||||
|
return $app['serializer']->serialize($data, 'json');
|
||||||
|
};
|
||||||
|
|
||||||
$app['security.firewalls'] = array(
|
$app['security.firewalls'] = array(
|
||||||
'login' => [
|
'login' => [
|
||||||
|
|
Loading…
Reference in a new issue