Передача ответа Slim 3 Exception на приложение Angular - PullRequest
0 голосов
/ 07 ноября 2019

Я создаю систему аутентификации, которая использует Slim 3 PHP на серверной части и Angular на клиентской части. До сих пор мне удавалось получить его, чтобы пользователь мог заполнить форму во внешнем интерфейсе и отправить запрос на отправку серверу для вставки этих данных в таблицу базы данных.

Angular Register Component:

this.Auth.postUserDetails(username, password).subscribe(data => {
  console.log(data, 'is what we received from the backend:');
  });

Служба угловой аутентификации:

postUserDetails(username, password) {
    return this.http.post('/api/achievement-forum-api/src/public/register',
      {username, password});
  }

Но на бэкэнде у меня есть некоторая проверка формы, которая выдает некоторые сообщения, когда говорят, что пароль меньше 8 символов, который находится вформа класса, расширяющая класс LogicException в PHP.

use Throwable;

class InvalidFormData extends \LogicException
{
    public function __construct($message = "Password must be at least 8 characters", $code = 0, Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }

}

Эти InvalidFormData генерируются при сбое проверки в конструкторе класса Password, где происходит проверка паролей:

public function __construct(string $tainted_password)
{
    $cleaned_password = filter_var($tainted_password, FILTER_SANITIZE_STRING);

    if ($this->isTooShort($cleaned_password))
    throw new InvalidFormData();

    $this->password = $cleaned_password;
}

Затем, наконец, в классе контроллера мы пытаемсязарегистрируйте пользователя, но если мы поймаем исключение InvalidFormData, мы извлечем созданное сообщение.

public function registerUser($request, $response)
{
    $tainted_username = $request->getParsedBody()['username'];
    $tainted_password = $request->getParsedBody()['password'];

    try
    {
        $this->authenticationService->registerUser($tainted_username, $tainted_password);
    }

    catch(InvalidFormData $e)
    {
        var_dump($e→getMessage()); //shows the message in the browsers console
    }
}

Вопрос:

Что я хотел бы сделать, это передать это сообщение в интерфейс Angular и отобразить его в форме, чтобы пользователь могудалось понять, почему они не прошли проверку.

Я прочитал документацию по ответам Slim 3, но я не уверен, если бы мне пришлось отправлять это сообщение обратно в качестве ответа Slim, и если да, то как мне перехватить это в Angular? Сначала я подумал, что мне может потребоваться запрос get в angular, чтобы получить сообщение, но я уверен, что есть способ сделать это в исходном запросе post.

Я прочитал некоторую документацию по Angular, и мне кажется, что мне нужно что-то сделать в методе подписки, но я не совсем уверен, что.

Надеюсь, кто-то может показать мне несколько примеров кодаэтого процесса. Как мне создать ответ Slim 3, содержащий сообщение, и как я могу записать его в Angular?

...