Symfony2可选的有序参数

时间:2015-11-25 16:40:38

标签: php symfony search

所以,我们有这种情况,这种WEIRD和UNNECESARY情况,但我们的SEO团队想要它,所以我们必须吞下去。

我们需要将搜索过滤器作为URL部分传递,而不仅仅是查询字符串(这将是明显和正常的事情)。

假设我们有三个过滤器

gender agelocation

好吧,就像在使用过滤器的任何搜索中一样,我们可以启用所有过滤器,也可以不启用。

在正常情况下,这将是/search?gender=female&age=25&location=london,在我们奇怪的情况下它应该是/search/female/25/london

但正如我所说,我们可以拥有全部或全部/search将是/search(是的)

这很简单,只有Controller SearchAction($gender, $age, $location)和路由/search/{gender}/{age}/{location}

但是,我们只想搜索femalelondon

哎呀!我们的路由,控制器和操作不会满足我们的需求,因为需要{age},我们不会使用它。

如果我们尝试搜索25 age且位于london的无性别人群,我们会遇到同样的问题,它也不会有效,我们需要{gender} {{1 }}

当然,我们不希望能够加载/search/25/london因为我们想要在我们的过滤器中订购,但是订购了所以我们没有重复的内容,你知道,SEO的东西...... < / p>

这就是我们的情况,我们需要一个控制器的动作,它可以处理/search/25/london/female个参数(我们现在已经算了5个),它们将是我们的搜索过滤器,按特定顺序,但同时是可选的。 ..

所以现在有点迷失了。我们已经定义了我们想要订单,我们想要过滤器,并且我们希望它们是可选的,所以“简单”的事情是我们知道第一个参数将始终是n但它可以是可选的,所以如果{gender}我们将在数据库查询中忽略它。

我不提供代码,因为我们所做的甚至不接近我们的目标,它只是一个可选参数数组和一堆无用的代码,它只是一个草稿。

我们可以为每个案例制作一个路由,并让层次结构处理它,如果缺少参数,但当然我要问的是,如果有可能和好看的方式使用尽可能少的行来做到这一点,因为你知道,代码必须很好维护。

3 个答案:

答案 0 :(得分:0)

过去我用以下方法处理这个问题:

/search/gender/{gender}/age/{age}/location/{location} 

也可以接受null - &gt;任何价值如:

 /search/gender/male/age/any/location/london

希望这个帮助

答案 1 :(得分:0)

如果你真的必须这样做(并且你听起来不错)那么我会按照你认为正确的方式构建它(使用可选参数 - 让我们调用这个searchAction)然后创建针对每种可能方案的操作,并使用内部转发指向searchAction

例如,您可以定义一个search/{gender}/{age}的路由,并且只有当age是一个整数时才匹配。然后在此操作中,您可以转发到主搜索,将您的操作中的参数作为参数传递给searchAction

return $this->forward(
  'MyBundle:Search:search', [], ['gender' => $gender, 'age' => $age]
);

然后重复/search/{gender}/{age}/{location}/search/{gender}/{location}等。

答案 2 :(得分:0)

可能从另一方面接近会更简单。 您可以将搜索路线设为&#39; / search / allGender / allAge / allLocation&#39;没有搜索词的情况。如果用户想要搜索25岁,那将是&#39; / search / allGender / 25 / allLocation&#39; ... 只是忽略&#34;保留&#39;数据库查询中的单词(&#39; allGender&#39;,#39; allAge&#39;,#39; allLocation&#39;)。 我认为你的SEO团队会满意这个解决方案。而且它很容易实现