如何从Symfony2中的搜索输入获取查询字符串

时间:2014-12-16 19:11:51

标签: php symfony search twig

用户从输入框提交搜索文本后,目标是将搜索结果显示在以下网址中:

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,即使用户执行搜索,我也不知道为什么会这样。

任何想法如何解决这个问题?

如果这通常是一种错误的方法来显示搜索结果,我会很感激有人能指出我更好的解决方案。请记住,我不能在这个项目中使用学说,因为我必须使用云数据库,所以我不认为搜索引擎包在这种情况下会起作用。

1 个答案:

答案 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