Laravel 5.5 - только лог 500 ошибка, никогда не отправлять подробности об ошибке через API?
Я сделал приведенный ниже контроллер, чтобы продемонстрировать проблему обработки 500 ошибок, которые я имею с API. Я хочу быть в состоянии определить, когда будет выдана ошибка 500, чтобы она никогда не доходила до клиента (так как слишком много деталей, чтобы поделиться с клиентом, и они должны регистрироваться только Laravel).
МетодgetUser()
преднамеренно возвращает ошибку 500 из-за опечатки firsgt()
class TestController extends Controller {
public function getUser() {
$data = User::firsgt(); //returns 500 error
return $data;
}
}
Как мы можем вернуть сообщение об ошибке типа "Произошла ошибка" вместо слишком большого количества деталей для клиента "Вызов неопределенного метода App\User::firsgt()"?
Примечание: я не хочу обрабатывать его по одному для каждого метода контроллера, но вместо этого перехватывать любые 500, прежде чем он будет возвращен клиенту, и возвращать пользовательское общее сообщение 500 "Произошла ошибка"
6 ответов
Просто измените переменные в вашем .env
файл, чтобы предотвратить отправку этих сообщений с ответом.
APP_ENV = производство
APP_DEBUG=false
Редактировать: просто настройка APP_DEBUG
ложно достаточно.
Обновление: если вы используете пакет dingo api, то помимо настройки APP_DEBUG
в false вам нужно отредактировать файл конфигурации.
Если вы еще этого не сделали, опубликуйте файл конфигурации dingo
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
Затем откройте config/api.php и отредактируйте errorFormat
значение для любого сообщения, которое вы хотите.
замещать :message
с общим сообщением
У тебя есть app/Exception/Handler.php
класс, чтобы сделать это. Например, вы можете использовать код, подобный следующему:
public function render($request, Exception $e)
{
$exception_class = get_class($e);
if (!in_array($exception_class, [ValidationException::class, ModelNotFoundException::class] ) {
return response()->json(['info' => 'Error occurred'], 500);
}
return parent::render();
}
но, как вы видите, вы должны исключить некоторые классы исключений, которые вы хотели бы отображать обычным способом, вот только некоторые примеры классов исключений.
Очевидно, что если вы разрабатываете API, вероятно, нет смысла использовать parent::render()
в общем, и вы должны обработать пользовательские классы исключений по-своему, а затем, наконец, для других исключений просто вернуть 500 ответ с нужным вам сообщением.
Ты можешь использовать try ... catch
try{
.....
}catch(\Exception $e){
if($e->getCode() == 500){
return response()->json(["error"=>'$e->getCode()'],500);
}
}
Подробное объяснение ошибки приведено в средах разработки, для производства вы не хотите их показывать - в целях безопасности - поэтому, как заявил @Hamoud, перейдите к .ENV
В файле найдите строку:
APP_DEBUG=true
измените это на:
APP_DEBUG=false
Это покажет только стандартные сообщения об ошибках. Проверьте документацию об деталях ошибки.
Laravel уже делает это для вас, но только если вы находитесь в производственном режиме и запрос ожидает JSON.
В любом случае, класс App\Exceptions\Handler - это место, где могут обрабатываться все исключения. Это также место, где все исключения регистрируются и обрабатываются самим Laravel.
public function render($request, Exception $exception)
{
// your logic here
return parent::render($request, $exception);
}
Если вы хотите использовать данные сообщения из ответа Laravel, естественно, вам нужно искать данные ответа, в которые включено сообщение. Это работает только тогда, когда APP_DEBUG=true, это не должно быть включено в производственной среде, но для ясности:
Предположим, вы используете
axios.get("/api/catalogs/clients/")
.then(res => {
this.client = res.data;
})
.catch(e => {
print(e.message); //This would print Server error
this.clientError = e.response.data.message; //This will print Call to undefined method
});