Как я могу заставить Laravel вернуть пользовательскую ошибку для API JSON REST

Я разрабатываю какой-то RESTful API. Когда возникает некоторая ошибка, я бросаю ошибку App::abort($code, $message) .

Проблема в том, что я хочу, чтобы он выбрал массив json с ключами «code» и «message», каждый из которых содержал вышеупомянутые данные.

 Array ( [code] => 401 [message] => "Invalid User" ) 

Кто-нибудь знает, если это возможно, и если да, то как я это делаю?

    перейдите в app/start/global.php .

    Это преобразует все ошибки для 401 и 404 в пользовательскую json-ошибку вместо стоп-кода Whoops. Добавь это:

     App::error(function(Exception $exception, $code) { Log::error($exception); $message = $exception->getMessage(); // switch statements provided in case you need to add // additional logic for specific error code. switch ($code) { case 401: return Response::json(array( 'code' => 401, 'message' => $message ), 401); case 404: $message = (!$message ? $message = 'the requested resource was not found' : $message); return Response::json(array( 'code' => 404, 'message' => $message ), 404); } }); 

    Это один из многих вариантов обработки этих ошибок.


    Создавая API, лучше создать свой собственный помощник, например, Responser::error(400, 'damn') который расширяет класс Response .

    Скорее всего:

     public static function error($code = 400, $message = null) { // check if $message is object and transforms it into an array if (is_object($message)) { $message = $message->toArray(); } switch ($code) { default: $code_message = 'error_occured'; break; } $data = array( 'code' => $code, 'message' => $code_message, 'data' => $message ); // return an error return Response::json($data, $code); } 

    Вы можете передать массив возвращаемому ответу JSON:

     $returnData = array( 'status' => 'error', 'message' => 'An error occurred!' ); return Response::json($returnData, 500); 

    Вот что я использую (Laravel 5.2):

    Согласно: https://laravel.com/docs/5.2/errors , мы можем указать собственную функцию визуализации для ошибок в app\Exceptions\Handler.php . Все, что я сделал, это изменить мою функцию рендеринга на это:

      /** * Render an exception into an HTTP response. * Updated to return json for a request that wantsJson * ie: specifies * Accept: application/json * in its header * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { if ($request->ajax() || $request->wantsJson()) { return response()->json( $this->getJsonMessage($e), $this->getExceptionHTTPStatusCode($e) ); } return parent::render($request, $e); } protected function getJsonMessage($e){ // You may add in the code, but it's duplication return [ 'status' => 'false', 'message' => $e->getMessage() ]; } protected function getExceptionHTTPStatusCode($e){ // Not all Exceptions have a http status code // We will give Error 500 if none found return method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500; } 

    После этого все, что вам нужно сделать, это убедиться, что все ваши запросы API указывают заголовок Accept: application/json . Надеюсь это поможет 🙂

    Согласно ответу Ибрагима, не каждый запрос ajax хочет JSON, ответ на «код состояния» и «статус» не нужны, поскольку оба они означают одно и то же. Более того, нет необходимости упоминать в ответе «статус» вообще, поскольку код ответа «говорит» об этом. Что-то вроде этого должно работать отлично:

     /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { if ($request->wantsJson()) return response()->json( ['message' => $e->getMessage()], method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500); return parent::render($request, $e); }