Symfony URL组织

Symfony URL组织,symfony,frameworks,navigation,symfony1,url-routing,Symfony,Frameworks,Navigation,Symfony1,Url Routing,我正在处理的项目包含搜索功能。我希望用户能够将一个页面与他们的查询一起添加书签,这样他们就可以将他们的搜索页面添加书签 在传统的实现中,我只是在URL中使用GET参数 然而,对于symfony,我很难理解该功能最好使用什么?这只是偏好的问题吗 我是否应该创建一个控制器,例如: search/{query}/{page} 当用户单击某个选项时 description/{id} 或者我应该在URL中实现传统的get变量: 例如,请注意URL的堆栈溢出。当您搜索某个内容并浏览页面时,URL类似于: s

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

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

然而,对于symfony,我很难理解该功能最好使用什么?这只是偏好的问题吗

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

search/{query}/{page}

当用户单击某个选项时

description/{id}

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

例如,请注意URL的堆栈溢出。当您搜索某个内容并浏览页面时,URL类似于:

search?q=“nav&page=2
但是当你点击一篇帖子时,默认情况下,URL会变成类似于
questions/19157969/扩展导航的内容
,所以它是两者的混合体

对于相同的功能,不能使用类似于
搜索/搜索词here/2
的东西吗?使用Symfony选择“放弃”选项有什么好处吗


非常感谢您的建议!非常感谢您!这是一个优先选择的问题。有人说,出于SEO目的,URL比查询字符串更重要。另外,/search/{query}/{page}总的来说,它看起来更好,但这只是我的观点。

搜索词可能会很长。也许你的搜索机制相当简单,但我个人不想做这样的假设,特别是如果你计划在将来的某件事情上使用相同的功能,而你还没有设计出它的规模

在我看来,使用一个典型的GET字符串足够安全,控制器应该知道它需要什么变量,并且GET查询通常不会(不应该)对路由产生影响

但是,如果您想获得可以随时重新访问的漂亮的搜索URL,可以尝试将每个搜索存储在数据库中

示例(未经测试):

在本例中,请求发送到一个操作,该操作的GET字符串与普通操作一样(如果愿意,可以是POST),该操作保存搜索数据,然后重定向到一个操作,该操作从数据库获取搜索数据,进行过滤并显示结果

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

此外,根据流行搜索词绘制报告(偶尔)总是很有用的

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
        );
    }
}