0

我正在处理的一个项目包含一个搜索功能。我希望用户能够将页面与他们的查询一起添加书签,以便他们可以为他们的搜索页面添加书签。

在传统的实现中,我只是在 URL 中使用了 GET 参数。

但是,对于 symfony,我很难理解什么最适合这个功能?这只是偏好问题吗?

我应该只创建一个控制器,例如:

search/{query}/{page}

当用户点击一个选项时

description/{id}

或者我应该在 URL 中实现传统的 get 变量:

例如,请注意 Stack Overflow 上的 URL。当您搜索某些内容并浏览页面时,URL 类似于:

search?q="nav&page=2但是当你点击一个帖子时,URL 会变成类似的questions/19157969/expanded-navigation-by-default,所以它是两者的混合。

不能使用类似的东西search/search-term-here/2来实现相同的功能吗?使用 Symfony 选择 GET 有什么好处吗?

我很感激任何建议!提前谢谢了!

4

2 回答 2

0

这是一个偏好问题。有人说,对于 SEO,URL 比查询字符串更重要。此外, /search/{query}/{page} 通常看起来更好,但这只是我的意见。

于 2013-10-08T16:09:56.517 回答
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),它保存搜索数据,然后重定向到一个从数据库中获取搜索数据的操作,进行过滤并显示结果。

在这样的技术中,我看不到任何真正的性能损失,插入和选择搜索的数据库查询应该相对较小,但我可以看到存储它们的表很快就会变得非常满。

再说一遍,(偶尔)绘制关于热门搜索词的报告总是有用的。

于 2013-10-08T16:11:04.947 回答