我正在处理的项目包含搜索功能。我希望用户能够将页面与他们的查询一起加入书签,以便他们可以为搜索页面添加书签。
在传统的实现中,我只是在URL中使用了GET参数。
然而,对于symfony,我很难理解什么是最适合这个功能的?这只是一个偏好问题吗?
我应该只创建一个控制器,例如:
search/{query}/{page}
当用户点击选项时
description/{id}
或者我应该在URL中实现传统的get变量:
请注意Stack Overflow上的URL。当您搜索某些内容并导航页面时,URL类似于:
search?q="nav&page=2
但是,当您点击帖子时,网址会变成类似questions/19157969/expanded-navigation-by-default
的内容,因此它可能是两者的混合。
无法使用类似search/search-term-here/2
的内容来实现相同的功能吗?使用Symfony对选择GET有什么好处?
我感谢任何建议!非常感谢提前!
答案 0 :(得分:0)
这是一个偏好的问题。有人说为了SEO目的,URL比查询字符串更重要。此外,/ search / {query} / {page}一般情况下看起来更好,但这只是我的意见。
答案 1 :(得分:0)
搜索字词可能会很长。也许你的搜索机制相当简单,但我个人不想做出这样的假设,特别是如果你打算在将来使用相同的功能而你还没有设计规模。
在我看来,使用典型的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),这会保存搜索数据,然后重定向到从数据库获取搜索数据的操作,进行过滤并显示结果。
我在这样的技术中看不到任何真正的性能损失,插入和选择搜索的数据库查询应该相对较小,但是我可以看到存储它们的表非常快。< / p>
然后再次使用热门搜索词来绘制报告总是有用的(偶尔)。