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 «Произошла ошибка».


person Wonka    schedule 15.11.2017    source источник


Ответы (5)


Просто измените переменные в файле .env, чтобы эти сообщения не отправлялись вместе с ответом.

APP_ENV=производство

APP_DEBUG=false

Изменить: достаточно просто установить для APP_DEBUG значение false.

Обновление: если вы используете пакет API dingo, помимо установки APP_DEBUG в false вам необходимо отредактировать файл конфигурации.

Если вы еще этого не сделали, опубликуйте файл конфигурации dingo

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

Затем откройте config/api.php и измените значение errorFormat на любое сообщение, которое вы хотите.

Замените :message общим сообщением

person Hamoud    schedule 15.11.2017
comment
Это очень хорошо работает на стандартном laravel, но у меня проблема с использованием dingo api. Помечено как правильное, так как это помогает другим и мне в решении laravel (которое, как я думал, решит мою конкретную проблему), но не работает при использовании с dingo API. Откроет вопрос для версии dingo API того же вопроса. - person Wonka; 16.11.2017

Для этого у вас есть 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 с сообщением, которое вы хотите.

person Marcin Nabiałek    schedule 15.11.2017
comment
Спасибо за это, я нашел для laravel, было намного проще просто сделать APP_DEBUG = false, чтобы он безопасно/обычно обрабатывал ошибки «произошла ошибка» для клиентов. Проблема у меня все еще стоит, но с dingo api, поэтому я открыл тот же вопрос, но для dingo api. - person Wonka; 16.11.2017

Вы можете использовать try ... catch

try{
   .....
}catch(\Exception $e){
  if($e->getCode() == 500){
      return response()->json(["error"=>'$e->getCode()'],500);
  }
}
person Niklesh Raut    schedule 15.11.2017
comment
правда, но я не хотел явно использовать try catch в своем коде для всех методов контроллера. Простой глобальный способ обработать любые 500 бросков laravel и зафиксировать всплывающую ошибку. - person Wonka; 16.11.2017

Laravel уже делает это за вас, но только если вы находитесь в рабочем режиме и запрос ожидает JSON.

В любом случае класс App\Exceptions\Handler — это место, где можно обрабатывать все исключения. Это также место, где все исключения регистрируются и обрабатываются самим Laravel.

public function render($request, Exception $exception)
{
    // your logic here

    return parent::render($request, $exception);
}
person Alley Shairu    schedule 15.11.2017

Подробное объяснение ошибки показано в средах разработки, для производства вы не хотите их показывать - по соображениям безопасности, поэтому, как заявил @Hamoud, перейдите в свой файл .ENV и найдите строку:

APP_DEBUG=true

изменить его на:

APP_DEBUG=false

Это покажет только стандартные ответы об ошибках. Ознакомьтесь с документацией по подробным сведениям об ошибке.

person Kenny Horna    schedule 15.11.2017