Symfony2形成,搜索和SEO友好的网址

时间:2015-08-06 10:42:01

标签: php forms symfony url seo

好的,这就是问题所在:

我有一个搜索表单,其中有几个输入字段来指定搜索请求。我使用Symfony2表单来受益于验证,CSRF保护和所有优秀的爵士乐。

现在,我希望搜索结果的网址既SEO友好又可收藏。 e.g。

http://www.example.com/blue-car-in-Berlin-200km/

我在做一些研究之后的当前方法是构建所需的搜索slug并重定向到另一个动作,如下所示:

//some form code
if($searchForm->isValid()){
   $searchWidget = $searchForm->getData();

   if(!empty($searchWidget->getSearch())) 
       $slug = $searchWidget->getSearch();
   if(!empty($searchWidget->getPlace())) 
       $slug .= '-in-' . $searchWidget->getPlace()->getName());
   if(!empty($searchWidget->getDistance())) 
       $slug .= '-' . $searchWidget->getDistance().'km';

   return $this->redirectToRoute('app_search', array('search'=>$slug));
}

第二个控制器基本上应该是这样的:

public function searchAction(Request $request, $search)
{
    //extract actual terms out of the $search - slug
    ....
    //find a way to inject the terms in the current request-Object (dirty)
    ...
    //do all validation again
}

正如代码中已经说明的那样,这感觉非常低效和繁琐。难道没有更好的方法来做这一切吗?就像拥有一个独立于实际逻辑的URL表示一样?

此外,是否有一个干净的解决方案,使用symfony形式的所有好处,没有实际的请求参数,但有这个请求slug?。

由于

2 个答案:

答案 0 :(得分:1)

你可以像这样定义search动作的路线(我在这里使用注释):

/**
 * @Route("/search/{search}-in-{place}-{distance}km", name="app_search")
 * @Method({"GET"})
 */
public function searchAction(Request $request, $search, $place, $distance)
{
    // Your code here
}

当然,如果这三个搜索参数是唯一需要的参数并且只有它们都是强制性的,那么这是有效的;如果搜索参数不是必需的,则必须定义更多路由以匹配所有可能的组合(我认为这不是正确的方法)。

更简单的解决方案是创建一个动态slug(它可以有一个或多个值),并使用某种固定格式,您可以从中轻松提取所有需要的搜索值。但是在这一点上我想问:为什么不使用一些简单的GET参数(类似/search?search=blue+car&place=berlin&distance=200)?

<强>更新

扩展灵活搜索字符串的想法,您可以尝试类似的东西:

/**
 * @Route("/search/{searchString}", name="app_search")
 * @Method({"GET"})
 */
public function searchAction(Request $request, $searchString)
{
    // Your code here
}

searchString可以是类似的东西(&#34;&lt; ...&gt;&#34;是真实数据的占位符,例如&#34; city-berlin&#34;):< / p>

city-<...>/distance-<...>/place-<...>

您只需要explode by&#39; /&#39;然后,对于每件作品,由&#39; - &#39;并使用第一部分作为搜索内容的ID。第一个explode应该返回类似的内容:

[
    'city-<...>',
    'distance-<...>',
    'place-<...>'
]

每个元素的第二次爆炸应该返回

[ 'city', '<...>' ]

这种方法最灵活,因为搜索参数的顺序并不重要,分析不需要参数。

答案 1 :(得分:0)

我认为你需要SEO bundle