需要Symfony2 POST请求,而是接收GET

时间:2012-11-29 10:21:51

标签: php http search symfony zend-search-lucene

我正在尝试使用干净的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 )。< / p>

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

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

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

由于我不需要使用实体,它永远不会成为POST请求而永远不会进入if('POST' === $request->getMethod()),现在它变成了GET请求,它也破坏了我保留URL的全部内容干净。

我知道我的做法和额外的重定向,但我不知道如何为搜索保留一个干净的URL。我对任何关于整个过程的建议持开放态度。

3 个答案:

答案 0 :(得分:2)

一些想法:

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

  • 虽然 clean 网址很好,所有搜索功能仍然应该利用好的查询语法[http://path.to/search?q=termToSearchFor];这样查询字符串永远不会被缓存,并且您确定始终获取更新的内容[无需指定缓存行为服务器端];

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

  • 关于此:

  

由于我不需要使用实体,它永远不会成为POST请求,也永远不会进入if('POST'=== $ request-&gt; getMethod()),现在它变成了GET请求,它也破坏了我保持URL清洁的整个过程。

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

如果您将其定义为/search/{query},您的网址仍然会“干净”,并按以下步骤更新您的操作:

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

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

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

答案 1 :(得分:1)

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

HTML中的

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

如果你想确定没有人会以其他方式(GET)加入此链接,那么修改路由

rule_name:
  pattern: /search/{query}
  defaults: { _controller: AcmeBundle:Search:search }
  requirements:
    _method:  POST

答案 2 :(得分:0)

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

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

感谢所有答案。

相关问题