【问题标题】:Many levels of categories in symfony route rulesymfony 路由规则中的多级类别
【发布时间】:2011-06-11 15:01:41
【问题描述】:

我想创建一个 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] 是动态的,可以来一个或多个,最后一个对我来说很重要。有什么想法吗?

非常感谢。

【问题讨论】:

    标签: symfony1 routing


    【解决方案1】:

    我认为这样的事情可能会奏效:

    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 需要非常深的层次,我可能会考虑将中间部分变成单个变量,但也许其他人有更优雅的解决方案。

    【讨论】:

      【解决方案2】:

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

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

      因此,规则 /:category 捕获 /category1/category2 和 /category1 和 category1/category2/category3 等。

      注意这一点,因为这条规则也捕获了你应用程序中的所有路由,你需要在返回参数之前在方法内部应用额外的验证。

      还是谢谢你的回复。

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 2018-08-07
        • 1970-01-01
        • 2018-10-23
        • 2021-06-28
        • 2017-07-04
        • 2016-04-19
        • 1970-01-01
        相关资源
        最近更新 更多