Symfony:在 Twig render() 方法中提交后重定向
Symfony : redirect after submit in Twig render() method
我在 Twig 视图中有几个 post。对于每个 post,我想添加一个表单评论。
为了最好的可重用性,我在 Twig 中调用 render(controller())
。
Twig
:
{{ render(controller('App\Controller\User\PostController::comment',
{
'post': post,
}
)) }}
Controller
:
public function comment(Request $request, Post $post): Response
{
$comment = new PostComment();
$comment->setPost($post);
$form = $this->get('form.factory')->createNamedBuilder('post_comment_' . $post->getId(), PostCommentType::class, $comment)->getForm();
$form->handleRequest($this->get('request_stack')->getMasterRequest());
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($comment);
$entityManager->flush();
$this->redirectToRoute(...); // ERROR
}
return $this->render('user/post/_comment.html.twig', [
'form' => $form->createView(),
]);
}
但是提交后无法重定向。我明白了,从视图上看很复杂,HttpRequest已经通过了。
这是错误:
An exception has been thrown during the rendering of a template ("Error when rendering "http://project.local/index.php/u/root/post" (Status code is 302).").
你有解决办法吗?谢谢你:)
主要问题是处理您的无效表单。
1) 提交时重定向
如果您不在乎您的用户是否在评论页面(而不是渲染页面)如果他的表单无效,您可以简单地添加到您的渲染模板中:
{# 'user/post/_comment.html.twig' #}
{{ form_start(form, {'action': path('your_comment_route')}) }}
或
2) 提交后使用javascript重定向
如果您希望用户在表单出错时停留在同一页面,除了添加参数来更改控制器的结果外,我看不到任何其他解决方案
{{ render(controller('App\Controller\User\PostController::comment', {
'post': post,
'embedded': true,
} )) }}
然后在你的控制器中
if ($form->isSubmitted() && $form->isValid()) {
if($embedded) {
return $this->render('user/post/success.html.twig', [
//call this route by javascript?
'redirectRoute': $this->generateUrl()//call it in twig, it's just for better understanding
])
} else {
$this->redirectToRoute(...);
}
}
我在 Twig 视图中有几个 post。对于每个 post,我想添加一个表单评论。
为了最好的可重用性,我在 Twig 中调用 render(controller())
。
Twig
:
{{ render(controller('App\Controller\User\PostController::comment',
{
'post': post,
}
)) }}
Controller
:
public function comment(Request $request, Post $post): Response
{
$comment = new PostComment();
$comment->setPost($post);
$form = $this->get('form.factory')->createNamedBuilder('post_comment_' . $post->getId(), PostCommentType::class, $comment)->getForm();
$form->handleRequest($this->get('request_stack')->getMasterRequest());
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($comment);
$entityManager->flush();
$this->redirectToRoute(...); // ERROR
}
return $this->render('user/post/_comment.html.twig', [
'form' => $form->createView(),
]);
}
但是提交后无法重定向。我明白了,从视图上看很复杂,HttpRequest已经通过了。
这是错误:
An exception has been thrown during the rendering of a template ("Error when rendering "http://project.local/index.php/u/root/post" (Status code is 302).").
你有解决办法吗?谢谢你:)
主要问题是处理您的无效表单。
1) 提交时重定向
如果您不在乎您的用户是否在评论页面(而不是渲染页面)如果他的表单无效,您可以简单地添加到您的渲染模板中:
{# 'user/post/_comment.html.twig' #}
{{ form_start(form, {'action': path('your_comment_route')}) }}
或
2) 提交后使用javascript重定向
如果您希望用户在表单出错时停留在同一页面,除了添加参数来更改控制器的结果外,我看不到任何其他解决方案
{{ render(controller('App\Controller\User\PostController::comment', {
'post': post,
'embedded': true,
} )) }}
然后在你的控制器中
if ($form->isSubmitted() && $form->isValid()) {
if($embedded) {
return $this->render('user/post/success.html.twig', [
//call this route by javascript?
'redirectRoute': $this->generateUrl()//call it in twig, it's just for better understanding
])
} else {
$this->redirectToRoute(...);
}
}