CakePHP路由在页面控制器中

时间:2010-11-11 12:11:14

标签: php cakephp routing

我正在使用CakePHP创建一个站点,我需要为静态页面设置一些URL,这些页面由页面控制器处理。基本上我想要两种不同类型的静态页面,URLS

  

mysyte.com/page

应映射到app/views/pages/page.ctp

  

mysite.com/special/page

应映射到app/views/pages/special-page.ctp。请注意,在第一种情况下,页面也可以是“特殊的”。

我有点迷失了我必须为这种情况设置的路由。我试过使用这两条路线

Router::connect(
    '/special/:mypage',
    array('controller' => 'pages', 'action' => 'display'),
    array('pass' => array('mypage'), 'mypage' => '[a-z]+')
);
Router::connect('/*', array('controller' => 'pages', 'action' => 'display'));

并在页面控制器中

function display($page = null, $mypage = null) {
    if ($mypage) {
        $path = array('special-'. $mypage);
    }
    else {
        $path = func_get_args();
    }

    //The rest of the display action
}

问题是似乎:mypage作为动作中的第一个参数传递,即page,而不是mypage参数。

我怎么可能解决这个问题?

2 个答案:

答案 0 :(得分:2)

您只通过路由将一个参数传递给操作,这就是为什么它是第一个 - 它是唯一的参数。名字并不重要。

我会这样做:

Router::connect(
  '/:page',
  array('controller' => 'pages', 'action' => 'display'),
  array('pass' => array('page'), 'page' => '[a-z]+')
  ); 
Router::connect(
  '/special/:mypage',
  array('controller' => 'pages', 'action' => 'display_special'),
  array('pass' => array('page'), 'page' => '[a-z]+')
  );

控制器代码:

function display($page) {}
function display_special($page) {}

但如果你想要自己的方式,试试这个:

Router::connect(
  '/:special/:mypage',
  array('controller' => 'pages', 'action' => 'display'),
  array('pass' => array('special', 'mypage'), 'mypage' => '[a-z]+')
  );

答案 1 :(得分:0)

实际上我发现页面控制器已经处理了这种情况,检查页面和子页面。网址mysite.com/special/mypage使用唯一规则

指向app/views/pages/special/mypage.ctp
Router::connect('/*', array('controller' => 'pages', 'action' => 'display'));