2013-05-23 8 views
3

У меня есть код error.php, который запускается с помощью App::abort(404, $error) в моем контроллере. Еще мой код статуса ответа - 200 (ok). Я попытался с различными кодами ошибок, как 400, 403Laravel 4 всегда возвращает код состояния HTTP 200

// NotFoundException handler 
App::error(function(NotFoundException $e) 
{ 
    $default_message = 'The requested resource was not found'; 

    return Response::json(array(
     'error' => $e->getMessage() ?: $default_message, 
    ), 404); 
}); 
+0

Получаете ли вы сообщение json, указывающее, что эта ошибка действительно срабатывает? –

+0

yes Я получаю сообщение об ошибке в формате JSON. Я прерываю код состояния из ответа и отображаю сообщения в представлении –

+0

. Это больше похоже на отчет об ошибке, который должен быть подан в [GitHub] (http://github.com/laravel/framework/issues). Вы, конечно, не задавали никаких вопросов! –

ответ

7

Для тех, кто все еще прибегая к помощи этой проблемы:

я борюсь с этой проблемой в течение нескольких часов. Для меня проблема была вызвана проблемой с одним из моих контроллеров.

Проверьте все ваши контроллеры и убедитесь, что перед меткой <?php нет пробелов. Тег < ?php должен быть первым в этом файле. Один пространство перед <?php тега в любой из контроллеров, которые проложены в качестве таковых:

Route::controller('example', 'ExampleController'); 

Вызовет все коды состояния быть 200.

+0

Отличная находка! какая операционная система вы используете? –

+3

Я проверил все мои контроллеры ... все еще получаю эту проблему. – Adamski

6

Я считаю, несмотря на это, вы должны получить ответ 404, так что может быть еще что-то происходит, что это результат кода не включен в вашем вопросе.

Этот класс исключений, который выбрасывается для 404, равен NotFoundHttpException, а не NotFoundException.

Поскольку Laravel 4 использует HttpKernal Symfony, это исключение составляет here.

Вы можете видеть here, где App::abort() выбрасывает NotFoundHttpException при срабатывании 404.

Таким образом, ваш код должен выглядеть следующим образом:

// NotFoundHttpException handler 
App::error(function(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e) 
{ 
    $default_message = 'The requested resource was not found'; 

    return Response::json(array(
     'error' => $e->getMessage() ?: $default_message, 
    ), 404); 
}); 

Важен: Это будет только огнь на 404 статусов, так как это соответствующий код NotFoundHttpException. Другие коды статуса возвращают другие классы исключений. Для того, чтобы захватить все HTTP коды ошибок состояния исключения, типа намек на HttpException так:

// HttpException handler 
App::error(function(\Symfony\Component\HttpKernel\Exception\HttpException $e) 
{ 
    return Response::json(array(
     'error' => $e->getMessage(), 
    ), $e-> getStatusCode()); 
}); 

Наконец, рассмотрим using a bit of Content Negotiation when deciding to return JSON or HTML.

+0

Мне пришлось использовать все имя '\ Symfony \ Component \ HttpKernel \ Exception \ HttpException', иначе оно приводило к фатальной ошибке. Класс HttpException не существует. –

+0

О, полностью - Извините, я должен был указать это. Я отредактирую ответ, чтобы поместить его в – fideloper

+0

. Как примечание, App :: error() передает объект исключения и код состояния 'App :: error (function (Exception $ exception, $ code)', поэтому вы можете использовать '$ code', а не' $ exception-> getStatusCode() 'в случае необходимости –

0

Решение не работал для меня, так в случае, если кто-то все еще ищет ответ, я подумал, что лучше поставить его здесь вместо того, чтобы создать другой вопрос.

Через некоторое время я тоже была эта проблема, на мой app/Exceptions/Handler.php я имел:

if ($e instanceof ModelNotFoundException) { 
     if ($request->ajax()) { 
      return response() 
       ->json(['error' => ['No results']]) 
       ->header('status', 422); 
     } 
    } 

Это работало в моей местной окружающей среды, однако, в гомолога среде (которая воспроизводит производственную среду, просто чтобы быть ясно,), он не вернул правильный код состояния.

После очередной выглядеть я начал смотреть на документы Laravel, и я изменил звонок на следующее:

return response() 
     ->json(['error' => ['No results.']], 422); 

И что сделал трюк. Надеюсь, это поможет.