Использование кода ответа http / сообщения для указания перенаправления

#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() , чтобы проверить, содержит ли он «Пароль» или что-то в этом роде. Вы также можете проверить мой отредактированный ответ, поскольку вы можете получать исключения определенного типа.