PHP - 在带有 Slim 3 withRedirect() 响应的 Twig 视图上显示验证消息
PHP - Displaying validation messages on a Twig view with a Slim 3 withRedirect() response
我正在尝试在注册表单上显示验证错误消息。我正在为路由使用 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 class 函数的调用,它只是 returns 一个错误消息,它是一个字符串。当用户在提交表单时验证失败时,将成功显示错误消息。这是代码和输出:
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
重定向之前,您需要将消息保存到会话
在显示表单之前,您需要从会话中获取消息。
尝试使用包 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();
我正在尝试在注册表单上显示验证错误消息。我正在为路由使用 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 class 函数的调用,它只是 returns 一个错误消息,它是一个字符串。当用户在提交表单时验证失败时,将成功显示错误消息。这是代码和输出:
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
重定向之前,您需要将消息保存到会话
在显示表单之前,您需要从会话中获取消息。
尝试使用包 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();