是否可以在URL中没有控制器的情况下进行页面路由但仍有其他控制器工作?例如:
执行以下工作以使URL中没有/ pages /但是如果我尝试访问任何其他控制器它不起作用:
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'index'));
有没有办法设置路由器,以便它运行控制器/操作(如果存在)。如果没有它运行页面控制器/动作?
答案 0 :(得分:3)
我认为简短的回答是,不 - 这是不可能以你希望的方式*。路由不是真正的“逻辑”驱动,所以除非你能想出一种方法来匹配你想要的两个方面,你不能做“如果控制器存在,那么 _,否则_ “那种事。
*但是,您可以在路线文件中将每个“页面”添加为一行。这将允许直接访问“约”,“联系”......等,而与它们不完全匹配的事物由其余路径处理。
答案 1 :(得分: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文件创建一个路径。
答案 2 :(得分: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_\-]*'
)
);