Symfony URL组织

时间:2013-10-08 14:30:37

标签: symfony frameworks navigation symfony1 url-routing

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

在传统的实现中,我只是在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有什么好处?

我感谢任何建议!非常感谢提前!

2 个答案:

答案 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>

然后再次使用热门搜索词来绘制报告总是有用的(偶尔)。