好的,这就是问题所在:
我有一个搜索表单,其中有几个输入字段来指定搜索请求。我使用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?。
由于
答案 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。