Laravel 5 API с Динго
Я строю API, используя Laravel 5 и Dingo. Как мне перехватить запросы, для которых не определен маршрут? Я хочу, чтобы мой API всегда отвечал специально отформатированным ответом JSON.
Например, если у меня есть маршрут: $api->get( 'somepage','mycontroller@mymethod');
Как мне обработать случай, когда кто-то создает сообщение в том же URI, предполагая, что маршрут не определен?
По сути, Laravel создает исключение MethodNotAllowedHttpException.
Я попробовал это:
Route::any('/{all}', function ($all)
{
$errorResponse = [
'Message' => 'Error',
'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
];
return Response::json($errorResponse, 400); //400 = Bad Request
})->where(['all' => '.*']);
но я продолжаю получать исключение MethodNotAllowedHttpException.
Есть ли способ, которым я могу сделать это? Используя Middleware? Какой-то другой вид ловли на всем пути?
РЕДАКТИРОВАТЬ:
Попытался добавить это в app\Exceptions\Handler.php
public function render($request, Exception $e)
{
dd($e);
if ($e instanceof MethodNotAllowedHttpException) {
$errorResponse = [
'Message' => 'Error',
'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
];
return Response::json($errorResponse, 400);
}
return parent::render($request, $e);
}
Это не имело никакого эффекта. Я сделал дамп-автозагрузку и все такое. Я даже добавил дд ($ е), и это не имело никакого эффекта. Это кажется странным для меня.
РЕДАКТИРОВАТЬ - РЕШЕНИЕ
Догадаться. В то время как ответ Джеймса заставил меня задуматься в правильном направлении, произошло то, что Динго перевесил обработку ошибок. Чтобы настроить ответ на эту ошибку, необходимо изменить app\Providers\AppServiceProvider.php. Сделайте загрузочную функцию такой (по умолчанию она пуста)
public function boot()
{
app('Dingo\Api\Exception\Handler')->register(function (MethodNotAllowedHttpException $exception) {
$errorResponse = [
'Message' => 'Error',
'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
];
return Response::make($errorResponse, 400);
});
}
Принятие ответа Джеймса, потому что это заставило меня двигаться в правильном направлении.
Надеюсь, это поможет кому-то:) Это заняло лучшую часть моей ночи.... тьфу
1 ответ
Вы можете сделать это внутри app/Exceptions/Handler.php
перехватывая исключение и проверяя, является ли он экземпляром MethodNotAllowedHttpException
,
Если это так, вы можете выполнить логику, чтобы вернуть свой собственный ответ об ошибке.
Там же вы можете настроить свой чек, если хотите поймать экземпляры NotFoundHttpException
,
// app/Exceptions/Handler.php
public function render($request, Exception $e)
{
if ($e instanceof MethodNotAllowedHttpException) {
$errorResponse = [
'Message' => 'Error',
'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
];
return Response::json($errorResponse, 400);
}
if($e instanceof NotFoundHttpException)
{
$errorResponse = [
'Message' => 'Error',
'Error' => ['data' => 'Sorry, that resource is not found or the method is not allowed.' ]
];
return Response::json($errorResponse, 400);
}
return parent::render($request, $e);
}