Skip to content

Commit

Permalink
Merge pull request #3 from stem/scrutinizer
Browse files Browse the repository at this point in the history
Réorganisation du code pour être plus mieux sur scrutinizer
  • Loading branch information
stem committed Oct 28, 2014
2 parents 5d45ee5 + cc44387 commit cda2f51
Showing 1 changed file with 78 additions and 27 deletions.
105 changes: 78 additions & 27 deletions src/JSONServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,89 @@
*/
class JSONServiceProvider implements ServiceProviderInterface
{
private $app;

public function boot(Application $app)
{
}

public function register(Application $app)
{
// Gere le JSON en body
$app->before(
function (Request $request) {
if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
$data = json_decode($request->getContent(), true);
$request->request->replace(is_array($data) ? $data : array());
}
}
);

/* Error Handler magique :
* catch toutes les exceptions, et fait une réponse JSON normale, en gardant le code d'erreur HTTP :)
*/
$app->error(
function (\Exception $e, $code) use ($app) {
if (!is_a($e, "Symfony\Component\HttpKernel\Exception\HttpException")) {
$code = $e->getCode();
}
if (is_a($e, "InvalidArgumentException")) {
$code = 400;
}
if ($code >= 100 && $code < 500) {
return $app->json($e->getMessage(), $code);
}
return $app->json($app["debug"] == true ? $e->getMessage() : null, 500);
}
);
$this->app = $app;

$app->before([$this, "jsonInputHandler"]);
$app->error([$this, "errorHandler"]);
}

/**
* Gère le JSON dans le body d'une requête
*
* @param Request $request
*/
public function jsonInputHandler(Request $request)
{
// on ne s'interese qu'aux requêtes de type "application/json"
if (0 !== strpos($request->headers->get('Content-Type'), 'application/json')) {
return;
}

$params = json_decode($request->getContent(), true);
if (false === is_array($params)) {
$this->app->abort(400, "Invalid JSON data");
}

// OUF, on peut enfin faire ce qu'on a à faire...
$request->request->replace($params);
}

/**
* Gère les erreurs et retourne un truc standardisé
*
* Le code d'erreur HTTP est gardé, mais pas forcément le message, et sera encapsuler dans une réponse JSON
* Le message de l'exception n'est retourné que si ce n'est pas une erreur 500
* ou que le `debug` est activé
*
* @param \Exception $exception
* @param integer $code HTTP status code (100 <= $code <= 50x)
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function errorHandler(\Exception $exception, $code)
{
$code = $this->sanitizeExceptionCode($code, $exception);

switch (true) {
case 100 <= $code && $code < 500:
case $this->app["debug"] === true:
$message = $exception->getMessage();
break;

default:
$message = null;
break;
}

return $this->app->json($message, $code);
}

/**
* @param integer $code
* @param null|\Exception $exception
* @return integer
*/
private function sanitizeExceptionCode($code, \Exception $exception = null)
{
switch (true) {
case null !== $exception && !$exception instanceof \Symfony\Component\HttpKernel\Exception\HttpException:
return $this->sanitizeExceptionCode($exception->getCode());

case $exception instanceof \InvalidArgumentException:
return 400;

case 100 <= $code && $code < 600:
return $code;

default:
return 500;
}
}
}

0 comments on commit cda2f51

Please sign in to comment.