用户从输入框提交搜索文本后,目标是将搜索结果显示在以下网址中:
www.foo.com/search/<query_string>
以下是twig模板中的html:
<form
class="navbar-form"
method="get"
action="{{ path('path_id', {'searchTerm': app.request.query.get('search-term')}) }}"
role="search">
<div class="input-group">
<input type="search" class="form-control" placeholder="Search" name="search-term" id="search-term" required>
<div class="input-group-btn">
<button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
</div>
</div>
</form>
这是我在控制器中创建的路线:
/**
* @Route("/search/{searchTerm}", defaults={"searchTerm" = null})
* @Template()
*/
public function searchAction($searchTerm)
{
return array('searchTerm' => $searchTerm);
}
我已将搜索字词设置为默认值为null,因为如果我不这样做,则会显示错误消息,因为如果用户尚未设置,则不会设置树枝模板中的app.request.query.get
进行了搜索。
这种方法的问题是$searchTerm
总是在searchAction
中到达null,即使用户执行搜索,我也不知道为什么会这样。
任何想法如何解决这个问题?
如果这通常是一种错误的方法来显示搜索结果,我会很感激有人能指出我更好的解决方案。请记住,我不能在这个项目中使用学说,因为我必须使用云数据库,所以我不认为搜索引擎包在这种情况下会起作用。
答案 0 :(得分:3)
不幸的是,通过使用GET
提交表单,您实际上是将浏览器发送到:
/search/?search-term=my%20search%20string
使用POST
格式时,Symfony路由器不接受GET
或/route/{parameter}
个变量作为路由参数,您必须:
GET
参数/**
* @Route("/search")
* @Template()
*/
public function searchAction(Request $request)
{
$searchTerm = $request->query->get('search-term');
return array('searchTerm' => $searchTerm);
}
或
/**
* @Route("/searchSubmit")
*/
public function searchSubmitAction(Request $request)
{
$searchTerm = $request->query->get('search-term');
return $this->redirect($this->generateUrl('bundle_controller_search', array(
'searchTerm' => $searchTerm,
)));
}
您可能还需要修改您的搜索表单,以便在没有任何初始化参数的情况下使用action="{{ path('path_id') }}"
(我不确定为什么您想要将现有值传递到操作中它位于value=""
标记的input
。