页面控制器中的CakePHP路由
我正在用CakePHP创建一个站点,我需要为静态页面设置一些URL,这些页面由pages控制器处理。基本上,我希望有两种不同类型的静态页面,带有URL mysyte.com/page 应该映射到页面控制器中的CakePHP路由,php,cakephp,routing,Php,Cakephp,Routing,我正在用CakePHP创建一个站点,我需要为静态页面设置一些URL,这些页面由pages控制器处理。基本上,我希望有两种不同类型的静态页面,带有URL mysyte.com/page 应该映射到app/views/pages/page.ctp和 mysite.com/special/page 应该映射到app/views/pages/special page.ctp。请注意,在第一种情况下,页面也可以是“特殊”页面 我对这种情况下必须设置的路线有点迷茫。我试过使用这两条路线 Router::co
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
参数传递
我怎样才能解决这个问题呢?您只通过路由将一个参数传递给操作,这就是为什么它是第一个参数-它是唯一的一个。名字并不重要 我会这样做:
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]+')
);
事实上,我发现pages控制器已经处理了这种情况,检查页面和子页面。URL
mysite.com/special/mypage
指向app/views/pages/special/mypage.ctp
,只有一条规则
Router::connect('/*', array('controller' => 'pages', 'action' => 'display'));
重点是避免在页面控制器中编写第二个操作。但事实证明,正如我在回答中所解释的那样,它比这简单。这是一条非常贪婪的路线,最好将其保持在底部,否则其他任何东西都不会起作用。是的,这是一个静态站点,所有内容都由页面控制器管理。