作者:老王
缺省状态下,当你调用一个形如/posts/view/25的URL的时候,
CakePHP会认为你你要在PostsController对象上执行一个view(25)的动作。这时的
控制器代码,可能会是下面的样子:
复制内容到剪贴板
代码:
class PostsController extends AppController {
var $name = 'Posts';
function view($id) {
// $id
}
} 也就是说,GET变量25会作为view的参数传递给方法形参$id。
这和RoR缺省采用的方式有些不一样,在RoR的控制器里,暴露给外界的控制器方法基本都没有参数,所需要的外部GET变量都通过映射关系从params里获得。幸运的是在CakePHP里你也可以采用这样的方式,依然还用/posts/view/25做例子:
先定义Router规则,主要就是利用Router::connect方法,大概用法如下:
复制内容到剪贴板
代码:
Router::connect(
‘URL’,
array(‘paramName’ => ‘defaultValue’),
array(‘paramName’ => ‘matchingRegex’)
)在本例中,我们采用如下设置:
复制内容到剪贴板
代码:
Router::connect(
'/posts/view/:id/*',
array('controller' => 'posts', 'action' => 'view'),
array('id' => '[1-9][0-9]{0,9}')
); 如此设定路由后,我们在控制器里定义view方法的时候,就不用再设置一个类似$id的形参。
那我们如何得到25这个外部GET变量呢?答案是通在控制器里通过$this->params['id']获得。
复制内容到剪贴板
代码:
class PostsController extends AppController {
var $name = 'Posts';
function view() {
// $this->params['id']
}
}附:
定义路由规则的时候(/posts/view/:id/*),最后面的*是否需要写视情况而定,例如本例中,如果除了id还要传递别的东西,就需要写*,否则就不需要写*。大家可以自己测试看看就都清楚了。