symfony路由规则中的许多级别的类别

时间:2011-06-11 15:01:42

标签: symfony1 routing

我想创建一个symfony路由规则,其中可以有一个或多个级别,但最重要的是。为了更好地解释,这里是一个“示例”:

home_category:
  url:   /:sf_culture/:category1/:category2/:category3/:category4/:slug
  class: sfCategoryRoute
  param: { module: category, action: index }
  requirements:
    sf_culture: (?:es|en)

:category [n]是dinamics,可以来一个,最后一个对我很重要。有什么想法吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

我认为这样的事情可能会成功:

home_category_1:
  url:   /:sf_culture/:category1/:slug
  param: { module: category, action: index }
home_category_2:
  url:   /:sf_culture/:category1/:category2/:slug
  param: { module: category, action: index }
home_category_3:
  url:   /:sf_culture/:category1/:category2/:category3/:slug
  param: { module: category, action: index }
home_category_4:
  url:   /:sf_culture/:category1/:category2/:category3/:category4/:slug
  param: { module: category, action: index }

...相同的模块/操作与每个可能的URL模式匹配。如果URL需要很多级别,我可能会考虑将中间部分转换为单个变量,但也许其他人有更优雅的解决方案。

答案 1 :(得分:0)

我的解决方案是扩展sfRequestRoute,并覆盖matchesUrl方法,如下所示:

public function matchesUrl($url, $context = array())
{
    $url_tmp = explode('/', substr($url, 1));
    $url = (count($url_tmp)>1) ? '/'.$url_tmp[0].'/'.end($url_tmp) : $url ;

    if (false === $parameters = parent::matchesUrl($url, $context))
    {
        return false;
    }
....

所以,规则/:类别catch / category1 / category2和/ category1以及category1 / category2 / category3,等等。

要小心,因为此规则还会捕获应用程序中的所有路由,所以在返回参数之前,需要在方法内部应用额外的验证。

谢谢你的回复。