2

是否可以在 URL 中没有控制器的情况下进行页面路由,但其他控制器仍然可以工作?例子:

执行以下操作可以使 URL 中没有 /pages/ 的页面,但如果我尝试访问任何其他控制器,它就不起作用:

  • 从:Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
  • 至:Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'index'));

有没有办法设置路由器,以便它运行控制器/动作(如果存在)。如果它不运行页面控制器/动作?

4

3 回答 3

3

我认为简短的回答是,不 - 这不可能以您希望的方式*。路由并不是真正的“逻辑”驱动,所以除非你能想出一种方法来匹配你想要的东西在这两个方面你不能做“如果控制器存在,那么_,否则_ ”之类的事情。

*但是,您可以将每个“页面”作为一行添加到您的路线文件中。这将允许直接访问“about”、“contact” ...等,而与它们不完全匹配的事物则由剩余的路由处理。

于 2013-06-06T14:37:03.417 回答
3

我知道我迟到了,但这是我给正在寻找这个的人的提示。

routes.php

foreach(scandir('../View/Pages') as $path){
  if(pathinfo($path, PATHINFO_EXTENSION) == "ctp"){
    $name = pathinfo($path, PATHINFO_FILENAME);
    Router::connect('/'.$name, array('controller' => 'pages', 'action' => 'display', $name));
  }
}

这将为 View/Pages 文件夹中的每个 ctp 文件创建一个路由。

于 2013-12-26T21:58:01.367 回答
0

实际上,我通过为每个控制器而不是每个页面添加路由,以与上面 Dave 的答案相反的方式解决了这个问题。(我不会经常添加新控制器,但我会定期添加新内容。)

// define an array of all controllers that I want to be able to view the index page of
$indexControllers = array('posts','events','users');

//create a route for each controller's index view
foreach ($indexControllers as $controller) {
    Router::connect(
        '/' . $controller,
        array(
            'controller' => $controller,
            'action' => 'index'
        )
    );
}

//create a route to remove 'view' from all page URLs
Router::connect(
    '/:title',
    array(
        'controller' => 'contents',
        'action' => 'view'
    ),
    array(
        'pass' => array('title'),
        'title' => '[a-z0-9_\-]*'
    )
);
于 2014-01-23T01:53:44.733 回答