CakePHP 2.0路由和分页问题

时间:2012-06-26 12:45:22

标签: cakephp routing

在我的路线configuratoin中,我只使用自定义路线。现在我在分页问题上遇到了问题。

路线:

// 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不起作用,页面:2假定为一个月,并且由于不匹配的正则表达式,转换为'',因此数据库查询查找一个月''。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

为了以务实而又不那么优雅的方式解决这个问题,我提出了以下建议。首先,我连接了名为parameter的页面:

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

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

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

其次,我重读了食谱,看到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这样的东西,从而避免贪婪的明星(也许有人知道如何做到这一点)。