关于PHP:PHP-在带有Slim 3 withRedirect()响应的Twig视图上显示验证消息

PHP - Displaying validation messages on a Twig view with a Slim 3 withRedirect() response

我正在尝试在注册表单上显示验证错误消息。我将Slim 3框架用于路线,并使用Twig模板系统来显示html。当前,如果用户验证失败,我正在尝试在注册表单上显示错误消息。

这是注册表的小枝代码,请注意,{{email_error}}{{username_error}}{{password_error}}是用于打印表达式的Twig分隔符,在我的情况下,这是每个输入字段的错误消息。

register.html.twig:

1
2
3
4
5
6
7
8
9
10
11
{% extends 'header_footer.html.twig'%}
{% block content %}
    Register A New Account

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

到目前为止,我已经设法通过渲染一个新视图并提供一个选项数组来实现此目的,该选项数组具有一个字符串,该字符串表示寄存器Twig文件定界符并充当数组索引。然后,每个索引的值是对ValidateSanitise类的函数的调用,该类仅返回错误消息(字符串)。当用户在提交表单时验证失败时,将成功显示错误消息。这是代码和输出:

1
2
3
4
5
6
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

1
2
3
4
5
6
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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();