0

我正在尝试使用干净的 URL 实现搜索模块。类似于 www.website.com/search/ searchterm。我已经用 EWZSearchBundle 创建了一个可搜索的索引,因此不涉及数据库,因此不需要实体。

public function searchAction(Request $request)
{
    $form = $this->createFormBuilder()
        ->add('query', 'text')
        ->getForm();

    if('POST' === $request->getMethod()){
        $form->bind($request);
        if ($form->isValid()) {
            return $this->redirect($this->generateUrl('search_process', array('query' => $request->query->get('query'))));
        }

    }

    return array(
        'form'   => $form->createView(),
    );
}

我创建了一个没有实体的简单表单,并将表单操作发送给它自己。如果它是 POST 请求,我会验证表单并使用干净的 URL (www.website.com/search/searchterm) 将其发送到搜索过程

public function searchProcessAction($query)
{
    $search = $this->get('ewz_search.lucene');
    $results = $search->find($query);

    return array(
        'results'   => $results,
    );
}

在搜索过程中,我从干净的 URL 中获取搜索词,并在我的索引中搜索它并返回结果。这应该是一个非常简单的过程,只有一个问题。

因为我不需要使用实体,所以它永远不会变成 POST 请求,也永远不会进入if('POST' === $request->getMethod()).

我知道我的方式和额外的重定向,但我不知道如何保持一个干净的 URL 进行搜索。我愿意接受有关整个过程的任何建议。

4

3 回答 3

2

一些想法:

  • 根据经验,应该通过 GET 方法执行搜索操作:您没有创建任何内容,您只是在查询您的站点以获取一些结果;

  • 尽管干净的 URL 很好,但搜索功能仍应利用良好的 ol' 查询语法 [ http://path.to/search?q=termToSearchFor];这样查询字符串永远不会被缓存,并且您一定会始终获取更新的内容[无需指定缓存行为服务器端];

  • 如果您关心的是保护您的数据免受某些流量的影响,请考虑在表单中实施身份验证或 CSRF 令牌。

  • 关于这个:

因为我不需要使用实体,所以它永远不会变成 POST 请求,也永远不会进入 if('POST' === $request->getMethod()),现在它变成了 GET 请求,它也破坏了我保持 URL 清洁的全部内容。

这是完全错误的:POST 请求与实体无关,它只是您在请求标头中指定的一种模式,以便向服务器询问特定行为。

如果您将 url 定义为 ,您的 url 仍将是“干净的” /search/{query},并按如下方式更新您的操作:

public function searchAction($query){ ... }

但正如我之前所说,查询语法非常适合搜索行为,不应该将 POST 用于此类任务。

关于 RESTful 原则的精明阅读 - http://tomayko.com/writings/rest-to-my-wife

于 2012-11-29T10:44:49.453 回答
1

您必须使用 POST 方法提交表单。

在 HTML 中

<form action="YOUR ACTION" method ="post">

如果您想确保没有人会以其他方式(GET)访问此链接,请修改路由

rule_name:
  pattern: /search/{query}
  defaults: { _controller: AcmeBundle:Search:search }
  requirements:
    _method:  POST
于 2012-11-29T10:34:12.727 回答
0

我设法让它在不使用表单组件的情况下工作。我手动制作了表格,也接受了@moonwave99 建议的查询字符串格式。使用表单组件会给出更长的名称,例如 form[query] 和 form[_token],它会在 URL 中发送该表单的 CSRF 令牌。手动制作表单可以更好地控制查询字符串格式的 URL。

注意:请注意,与此同时,它会从该特定表单中删除 CSRF 安全性。

感谢所有的答案。

于 2012-12-03T07:23:09.963 回答