Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
页面控制器中的CakePHP路由_Php_Cakephp_Routing - Fatal编程技术网

页面控制器中的CakePHP路由

页面控制器中的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

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

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
参数传递


我怎样才能解决这个问题呢?

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

我会这样做:

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'));

重点是避免在页面控制器中编写第二个操作。但事实证明,正如我在回答中所解释的那样,它比这简单。这是一条非常贪婪的路线,最好将其保持在底部,否则其他任何东西都不会起作用。是的,这是一个静态站点,所有内容都由页面控制器管理。