如何使Symfony GET表单重定向到带参数的路由?

时间:2017-01-03 11:35:52

标签: forms get symfony

我想创建一个表单,用于通过用户名搜索个人资料,然后重定向到用户的个人资料页面。顺便说一句,我使用的是Symfony 3.2。

我认为这样做的自然方式是GET动作形式。它甚至允许客户使用良好的用户名直接更改网址以查看其个人资料。

这是我的控制器的代码:

ProfileController.php

//...

/** @Route("/profil/search", name="profil_search") */
public function searchAction() {          
    $builder = $this->createFormBuilder();
    $builder                
        ->setAction($this->generateUrl('profil_show'))
        ->setMethod('GET')
        ->add('username', SearchType::class, array('label' => 'Username : '))
        ->add('submit', SubmitType::class, array('label' => 'Search'));
    $form = $builder->getForm();

    return $this->render('profils/profil_search.html.twig', [
        'form' => $form->createView(),
    ]);
}   

/** @Route("/profil/show/{username}", name="profil_show") */
public function showAction($username) {      
    $repository = $this->getDoctrine()->getRepository('AppBundle:User');
    $searchedUser = $repository->findOneByUsername($username);

    return $this->render('profils/profil_show.html.twig', [
        'searchedUser' => $searchedUser,
    ]);
}   

//...

此代码将导致以下错误消息:

  

缺少一些必需参数(“用户名”)来生成URL   路线“profil_show”。

我彻底阅读了documentation,但无法猜测,我如何将username变量作为参数传递给profil_show路线?

如果我的做法不是好的,感谢您在评论中告诉我,但我仍然想知道如何使用GET表格。

编辑:

感谢@MEmerson的回答,我现在就知道了。所以对于像我这样的未来,我就是这样做的:

/** @Route("/profil/search", name="profil_search") */
public function searchAction(Request $request) {     
    $data = array();
    $builder = $this->createFormBuilder($data);
    $builder                
        //->setAction($this->generateUrl('profil_show'))
        //->setMethod('GET')
        ->add('username', SearchType::class, array('label' => 'Username : '))
        ->add('submit', SubmitType::class, array('label' => 'Search'));
    $form = $builder->getForm();

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $data = $form->getData();
        return $this->redirectToRoute('profil_show', array('username' => $data["username"]));
    }

    return $this->render('profils/profil_search.html.twig', [
        'method' => __METHOD__,
        'form' => $form->createView(),
        'message' => $message,
    ]);
}  

1 个答案:

答案 0 :(得分:1)

如果您查看错误消息,则说明问题出在您尝试为路径生成路径的地方' profil_show'。

您的控制器注释要求使用用户名

填充URL
/** @Route("/profil/show/{username}", name="profil_show") */

这意味着Symfony期望路由http://yoursite.com/profil/show/username。但是如果你想把它作为GET表单发布,那么它应该期待http://yoursite.com/profil/show?username

您可以添加第二条路线或将现有路线更改为

/** @Route("/profil/show", name="profil_show_search") */

应该解决你的问题。