PHP - Displaying validation messages on a Twig view with a Slim 3 withRedirect() response
我正在尝试在注册表单上显示验证错误消息。我将Slim 3框架用于路线,并使用Twig模板系统来显示html。当前,如果用户验证失败,我正在尝试在注册表单上显示错误消息。
这是注册表的小枝代码,请注意,
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'), ]); |
但是我尝试使用Slim3
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'), ])); |
我的问题是,如何将String(错误消息)传递给Slim 3 withRedirect()响应以显示在Twig视图上?是否可以像在第一组输出中渲染新视图那样进行操作?
请注意,我已经尝试过Slim Respect Validation框架,但我更喜欢这样做。
谢谢GR412
重定向之前,您需要将消息保存到会话中
在显示表单之前,您需要从会话中获取消息。
尝试使用超薄/flashpackage
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(); |