PHP - отображение сообщений проверки в представлении Twig с ответом Slim 3 withRedirect () - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь отобразить сообщения об ошибках проверки в форме регистрации.Я использую фреймворк Slim 3 для маршрутов и систему шаблонов Twig для отображения HTML.В настоящее время я пытаюсь отобразить сообщения об ошибках в форме регистрации, если пользователь не проходит проверку.

Вот код ветки для формы регистрации, обратите внимание, что {{email_error}}, {{username_error}} и {{password_error}} - это Twigразделители для распечатки выражений, в моем случае это сообщение об ошибке для каждого поля ввода.

register.html.twig:

{% extends 'header_footer.html.twig'%}
{% block content %}
    <h3>Register A New Account</h3>

    <form action = "{{ register_action }}" method = "post">
        <p>Email: <input type="text" name="email" value="{{ old.email }}" > {{ email_error }}<br></p>
        <p>Username: <input type="text" name="username" value="{{ old.username }}" > {{ username_error }}<br></p>
        <p>Password: <input type="text" name="password" > {{ password_error }}<br></p>
        <input type="submit" value="Create Account">
    </form>
{% endblock %}

Мне удалосьзаставить это работать до сих пор, предоставляя новое представление и предоставляя массив опций, который имеет строку, которая представляет разделители регистра Twig и действует как индекс массивов.Значением каждого индекса является вызов функции класса ValidateSanitise, которая просто возвращает сообщение об ошибке, представляющее собой строку.Когда пользователь не проходит проверку при отправке формы, сообщения об ошибках успешно отображаются.Вот код и вывод:

return $this->container->view->render($response, 'register.html.twig',
    [
       'email_error' => $sanitizer_validator->get_validate_messages('email_error'),
       'username_error' => $sanitizer_validator->get_validate_messages('username_error'),
       'password_error' => $sanitizer_validator->get_validate_messages('password_error'),
    ]);

enter image description here

Однако я попытался сделать это с ответом Slim3 withRedirect() вместо того, чтобы выдать новыйпросмотрел и сделал то же самое, где я предоставляю массив опций, но по какой-то причине сообщения об ошибках не появляются, если пользователь не проходит проверку при отправке формы, и страница регистрации перенаправляется для повторной попытки пользователя.Вот код и вывод:

return $response->withRedirect($this->container->router->pathFor('register',
    [    
        'email_error' => $sanitizer_validator->get_validate_messages('email_error'),
        'username_error' => $sanitizer_validator->get_validate_messages('username_error'),
        'password_error' => $sanitizer_validator->get_validate_messages('password_error'),
    ]));

enter image description here

Мой вопрос: как я могу передать строки (сообщения об ошибках) в Slim 3 с помощью Redirect?() отклик для отображения на ветке?Можно ли сделать это так, как я делал с рендерингом нового представления в первом наборе выходных данных?

Примечание. Я уже экспериментировал со средой Slim Respect Validation, но я предпочитаю свой способ сделать это.

Спасибо, GR412

1 Ответ

0 голосов
/ 03 декабря 2018

Перед перенаправлением необходимо сохранить сообщения в сеансе.

Перед отображением формы необходимо принять сообщения из сеанса.

попробуйте использовать пакет slim /вспышка

require dirname(__FILE__).'/../vendor/autoload.php';

session_start();

$app = new \Slim\App();

// Fetch DI Container
$container = $app->getContainer();

// Register provider
$container['flash'] = function () {
    return new \Slim\Flash\Messages();
};

$container['view'] = function() {
    /*
     * init your render
     */
    $view = new Render();
    return $view;
};


$app->get('/form', function ($request, $response, $args = []) {
    return $this->view->render(
        $response,
        'register.html.twig',
        [
            'register_action' => $this->router->pathFor('post_form'),
            'email_error' => $this->flash->getFirstMessage('email_error'),
            'username_error' => $this->flash->getFirstMessage('username_error'),
            'password_error' => $this->flash->getFirstMessage('password_error'),
            'old' => [
                'email' => $this->flash->getFirstMessage('old_email'),
                'username' => $this->flash->getFirstMessage('old_username'),
            ],
        ]
    );
})->setName('register');

$app->post('/form', function ($request, $response, $args = []) {
    $post = $request->getParsedBody();
    $this->flash->addMessage('old_email', $post['email']);
    $this->flash->addMessage('old_username', $post['username']);
    $email_error = null;
    $username_error = null;
    $password_error = null;
    /*
     * Your handler
     */
    if ($email_error) {
        $this->flash->addMessage('email_error', $email_error);
    }
    if ($username_error) {
        $this->flash->addMessage('username_error', $username_error);
    }
    if ($password_error) {
        $this->flash->addMessage('password_error', $password_error);
    }

    return $response->withRedirect($this->router->pathFor('register'));
})->setName('post_form');

$app->run();
...