我想创建一个表单,用于通过用户名搜索个人资料,然后重定向到用户的个人资料页面。顺便说一句,我使用的是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,
]);
}
答案 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") */
应该解决你的问题。