我正在尝试使用干净的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。我对任何关于整个过程的建议持开放态度。
答案 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安全性。
感谢所有答案。