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
                });
Другие вопросы по тегам