Недавно я оказался в ситуации, когда у меня была кодовая база, которая выдавала исключения из определенных красноречивых запросов, но вроде законным способом.
По сути, сценарий состоял в том, что определенные учетные записи пользователей не имели отношений с определенными моделями, но имели решающее значение для завершения работы контроллера.
Такого рода вещи обычно следует решать путем устранения проблемы в точке входа (проверка при создании пользователя), однако в данном конкретном случае было бы гораздо лучше вернуть пользователю сообщение об ошибке, чтобы сообщить ему, что требуется вмешательство человека.
Итак, чтобы решить эту проблему, мне нужно было поймать исключение, сгенерировать удобочитаемое сообщение и отправить его обратно в интерфейс. Эта функциональность не должна загромождать контроллеры и должна быть простой в обслуживании.
Вот мой пошаговый подход:
1. Установите черту характера
Поскольку мы, вероятно, хотим, чтобы эта функциональность была доступна во всем мире через приложение, давайте установим черту, которая очень полезна для такого рода вещей.
namespace App\Traits;
Trait GlobalUtility
{
// Code
}
2. Определите ошибки
В рамках признака мы создали массив сообщений об ошибках со значимым именем ключа для каждого. Сообщение по умолчанию добавляется, чтобы гарантировать, что что-то всегда возвращается.
namespace App\Traits;
Trait GlobalUtility
{
protected $customExceptionErrors = [
'generic' => 'Sorry, there was a problem with this page. Please contact your Sales Account Manager for help.',
'noDealerRelationship' => 'Sorry, your user account does not appear to be connected to a Dealer. Please contact your Sales Account Manager for help.'
];
}
3. Логика возврата
Метод возврата – это простая проверка того, что:
- Принимает именованный параметр исключения, который совпадает с ключами в массиве
$Ошибки пользовательских исключений - Извлекает сообщение об ошибке
- Возвращает строку ошибки или общую версию, если ничего не найдено (или параметр не передан)
namespace App\Traits;
Trait GlobalUtility
{
protected $customExceptionErrors = [
'generic' => 'Sorry, there was a problem with this page. Please contact your Sales Account Manager for help',
'noDealerRelationship' => 'Sorry, your user account does not appear to be connected to a Dealer. Please contact your Sales Account Manager for help.'
];
/**
* Returns a custom error message for the exception.
*
* @param string $exceptionName
* @return string
*/
public function getExceptionError($exceptionName = 'generic')
{
return $this->customExceptionErrors[$exceptionName] ?: $this->customExceptionErrors['generic'];
}
}
4. Добавьте признак и класс исключений в контроллер
Затем признак и класс исключений добавляются в контроллер, в котором выполняется красноречивый запрос.
После объявления пространства имен мы добавляем:
use App\Traits\GlobalUtility; use Illuminate\Database\Eloquent\ModelNotFoundException;
И внутри класса:
use GlobalUtility;
5. Обновите запрос
Теперь мы должны убедиться, что в запросе используется метод “или сбой”, например Первый или последний или findOrFail , затем вставьте его в блоки try & catch.
try
{
$dealer = $user->worksFor()->firstOrFail();
}
catch (ModelNotFoundException $e)
{
}
6. Настройте перенаправление
В операторе catch мы добавляем перенаправление с вызовом метода признака, чтобы получить соответствующую ошибку. Мы установим это как пользовательская ошибка , значение которой будет доступно позже в сеансе.
try
{
$dealer = $user->worksFor()->firstOrFail();
}
catch (ModelNotFoundException $e)
{
return redirect()->route('orders.history')->with([
'customError' => $this->getExceptionError('noDealerRelationship')
]);
}
7. Добавьте проверку и извлечение в файл Blade
Наконец, нам нужно спросить приложение, если пользовательская ошибка значение существует в сеансе, и если да, отобразите его.
{{-- Show custom defined errors (caught from exceptions) if they exist --}}
@if (Session::has('customError'))
{{ Session::get('customError') }}
@endif
И это все! Надеюсь, кто-то найдет это полезным:)
Оригинал: “https://dev.to/adam_crampton/catching-laravel-eloquent-exceptions-easy-peasy-error-messages-1mpn”