#php #laravel
#php #laravel
Вопрос:
Я вызываю конечную точку API ниже и перехватываю любые ошибки, возвращающиеся непосредственно из нее, декодирую и показываю их как ошибки:
try {
$authService = new AuthService();
$login = $authService->loginGetToken($email, $password);
}catch (Exception $e) {
$response = json_decode($e->getResponse()->getBody()->getContents());
$message = $response->message;
return Redirect::back()->withErrors($message);
}
Моя проблема: Если срок действия пароля истек, я возвращаю ошибку 400 с сообщением «Срок действия пароля истек»
Есть ли способ в моем блоке catch проверить, тот ли это код и сообщение, и если да, перенаправить их на просмотр auth.reset
, чтобы сбросить их пароль?
Комментарии:
1. Да, конечно. Вы уже выполняете перенаправление, поэтому добавьте некоторый код, который проверяет наличие конкретной ошибки #, и добавьте блок if-then-else, который перенаправляет на нужный вам URL.
2. Часть моей проблемы: пользователь может получить несколько видов ошибок 400, но только тот, у кого есть это сообщение, должен перенаправить на auth.reset. Однако как я могу проверить содержание сообщения?
3. Вы можете вызвать
$e->getMessage()
… php.net/manual/en/exception.getmessage.php … существует также$e-getCode()
способ получить код, поскольку вы спрашивали об обоих.4. Какую библиотеку вы используете?
5. Сообщение возвращается от клиента guzzle. Если я добавляю $ message на страницу, там просто говорится «Срок действия пароля истек»
Ответ №1:
Вы можете вызвать $e->getMessage()
… http://php.net/manual/en/exception.getmessage.php … также есть $e->getCode()
способ получить код, поскольку вы спрашивали об обоих.
Итак, что-то вроде:
if($e->getMessage() == 'Password is Expired') {
return redirect('auth/reset'); // or whatever your route is
}
Или использование вашего кода:
try {
...
} catch (Exception $) {
$response = json_decode($e->getResponse()->getBody()->getContents());
$message = $response->message;
if($message == 'Password is Expired') {
return redirect('auth/reset'); // or whatever your route is
}
return Redirect::back()->withErrors($message);
}
Вы также можете обнаружить, что получаете исключение определенного типа, которое вы могли бы перехватить:
catch (PasswordExpiredException $e) {
... // password is expired
} catch (Exception $e) {
... // something else happened
}
Комментарии:
1. Что ж, я уже получаю сообщение. Мой код для этого приведен выше, поэтому он правильно выводит ответ. Я просто не знаю, как лучше сказать
if response == 'Password is Expired' then redirect
2. в моем коде $ message выводит то, что мне нужно увидеть. Мне просто нужно проверить это как условие для перенаправления
3. Хорошо, похоже, вам просто нужно проверить сообщение, а затем при необходимости перенаправить. Я обновил ответ.
4. Я считаю, что это работает, спасибо. Есть ли способ проверить, похоже ли это, например, на оператор mysql LIKE?
5. Вы могли бы использовать Laravel
Str::contains()
, чтобы проверить, содержит ли он «Пароль» или что-то в этом роде. Вы также можете проверить мой отредактированный ответ, поскольку вы можете получать исключения определенного типа.