【问题标题】:CakePHP 2.0 Routing and Pagination IssueCakePHP 2.0 路由和分页问题
【发布时间】:2012-06-27 18:54:40
【问题描述】:

在我的路线配置中,我只使用自定义路线。现在我遇到了分页问题,​​在它运行良好之前。

路线:

// view all posts by year and month
Router::connect('/blog/:year/:month/*', array(
 'controller' => 'posts',
 'action' => 'index',
 'month' => null
), array(
  'pass' => array(
    'year',
    'month'
  ),
  'year' => '[12][0-9]{3}',
  'month' => '0[1-9]|1[012]'
));

这应该执行以下操作:/blog/2012/ 应该列出 2012 年的所有帖子,而月份不相关。 /blog/2012/05/ 应该列出 2012 年 5 月以来的所有帖子,月份是相关的。我在末尾添加了 /* 以使用 /blog/2012/05/page:2,现在可以正常使用。但是,/blog/2012/page:2 不起作用,page:2 被假定为一个月,并且由于不匹配的正则表达式,转换为'',因此数据库查询查找一个月''。

我可能不知何故没有完全掌握路由,以及如何声明可以传递和不能传递的变量,但是我如何重写这个配置使其工作,而不从根本上改变它?我真的认为这是一个配置问题。 谢谢。

【问题讨论】:

    标签: cakephp routing


    【解决方案1】:

    如果你禁用了所有默认的 Cake 路由,它将停止分页工作,你只能通过添加来获取用于分页的路由:

    Router::connectNamed(false, array('default' => true));

    http://book.cakephp.org/2.0/en/development/routing.html#controlling-named-parameters

    【讨论】:

    • 谢谢.. 我也这样做了,但我不确定它是否真的解决了问题,因为我还引入了其他措施(见我的回答)。
    【解决方案2】:

    为了以一种务实但可能不那么优雅的方式解决这个问题,我想出了以下方法。首先我连接了页面命名参数:

    Router::connectNamed(array('page' => '[\d]+'), array(
     'default' => false,
     'greedy' => false
    ));
    

    according to the cookbook,这只会启用页面命名参数并禁用所有其他页面,它只接受数值。

    我不确定这是否与我的具体问题特别相关。

    其次,我重读了说明书并看到here routes.php 中的连接顺序非常重要。即,当必须路由 url 时,文件顶部的连接比底部的连接具有更高的优先级。于是,我想出了这个配置顺序:

     // view all posts by year and month
     Router::connect('/blog/:year/:month/*', array(
        'controller' => 'posts',
        'action' => 'index'
      ), array(
        'year' => '[12][0-9]{3}',
        'month' => '0[1-9]|1[012]'
      ));
    
      // view all posts by year
     Router::connect('/blog/:year/*', array(
        'controller' => 'posts',
        'action' => 'index'
     ), array('year' => '[12][0-9]{3}'));
    
      // view all posts
      Router::connect('/blog/*', array(
         'controller' => 'posts',
         'action' => 'index'
      ));
    

    之前是反过来的,即先连接/blog/*。由于贪婪的明星,这“吞噬”了一切,还有像 /blog/2012/ 这样的东西,其中 2012 只是作为参数传递。而现在,我可以想出 /blog/2012/page:2、/blog/2012/05/page:2 和 /blog/2012/5ssfd/page:2 之类的“假”网址将映射到 /blog/ 2012/page:2,即在这种情况下,第一个连接不匹配,所以它跳转到第二个连接。我这样做的原因是我无法做 /blog/:year/:month/page:page 之类的事情,从而避免了贪婪的明星(也许有人知道如何做到这一点)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2012-07-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多