【问题标题】:PHP - Displaying validation messages on a Twig view with a Slim 3 withRedirect() responsePHP - 在带有 Slim 3 withRedirect() 响应的 Twig 视图上显示验证消息
【发布时间】:2018-12-01 11:59:10
【问题描述】:

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

这是注册表单的 twig 代码,请注意 {{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'),
    ]);

但是,我尝试使用 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'),
    ]));

我的问题是,如何将字符串(错误消息)传递给 Slim 3 withRedirect() 响应以显示在 Twig 视图上?是否可以像我在第一组输出中渲染一个新视图一样这样做?

注意我已经尝试过 Slim Respect Validation 框架,但我更喜欢我的方式。

谢谢,GR412

【问题讨论】:

    标签: php validation twig forms slim-3


    【解决方案1】:

    在重定向之前,您需要将消息保存到会话中

    在显示表单之前,您需要从会话中获取消息。

    尝试使用包slim/flash

    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();
    

    【讨论】:

    • 这是有道理的,但是我一直在尝试按照您所说的去做,但似乎无法让 twig 访问包含该消息的会话。您能否修改您的答案以显示我如何使其与会话一起使用?谢谢。
    • 完成。代码中可能存在错误。没时间检查。但本质应该清楚
    • 感谢您的编辑,感谢您抽出宝贵时间。我会看看我能变出什么来。
    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2012-06-11
    • 2020-12-06
    相关资源
    最近更新 更多