搜索词可能会变得很长。也许您的搜索机制相当简单,但我个人不想做出这样的假设,特别是如果您计划在未来为您尚未设计规模的事物使用相同的功能。
在我看来,使用典型的 GET 字符串足够安全,控制器应该知道它需要哪些变量,并且 GET 查询通常不会(不应该)对路由产生影响。
但是,如果您想获得可以随时重新访问的漂亮搜索 URL,您可以尝试将每个搜索存储在数据库中。
一个例子(未经测试):
class SearchController extends Controller
{
/**
* @Route("/search" name="search")
* @Method("GET")
*/
public function searchAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$search = new Search();
$search->setQuery($request->query);
// The query field would be of an object type in this example,
// but you could store the data any way you want really.
// Add any additional information about the search/request to the entity.
$em->persist($search);
$em->flush();
$this->redirect($this->generateUrl('search_results', array(
'search_id' => $search->getId()
)));
}
/**
* @Route("/search/{search_id}", name="search_results")
* @Method("GET")
* @Template()
*/
public function resultsAction($search_id)
{
$em = $this->getDoctrine()->getManager();
if(! $search = $em->getRepository('AcmePostBundle:Search')) {
throw $this->createNotFoundException();
}
$query = $search->getQuery(); // This will be a ParameterBag
// Run your search filters
return array(
// Your search results
);
}
}
在这个例子中,请求是一个带有 GET 字符串的操作(如果您愿意,可以是 POST),它保存搜索数据,然后重定向到一个从数据库中获取搜索数据的操作,进行过滤并显示结果。
在这样的技术中,我看不到任何真正的性能损失,插入和选择搜索的数据库查询应该相对较小,但我可以看到存储它们的表很快就会变得非常满。
再说一遍,(偶尔)绘制关于热门搜索词的报告总是有用的。