Symfony:在Twig render()方法中提交后重定向

时间:2018-03-08 14:53:17

标签: symfony twig symfony-forms

我在Twig视图中有几篇帖子。对于每个帖子,我想添加表单注释。

为了获得最佳可重用性,我在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已经过去了。

这是错误:

  

在渲染模板期间抛出异常("渲染时出错" http://project.local/index.php/u/root/post"(状态代码为302)。")。

你有解决方案吗?谢谢你:))

1 个答案:

答案 0 :(得分:1)

主要问题是处理无效表格。

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