发新话题
打印

CakePHP中的Router映射

CakePHP中的Router映射

作者:老王

缺省状态下,当你调用一个形如/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还要传递别的东西,就需要写*,否则就不需要写*。大家可以自己测试看看就都清楚了。

TOP

Cake哪个版本较稳定一些,, 老王用的哪个?

TOP

引用:
原帖由 山水 于 2007-11-30 20:56 发表
Cake哪个版本较稳定一些,, 老王用的哪个?
CakePHP1.1目前是Stable的,1.2是Pre-beta的,但是1.2的功能和1.1相比,有质的提升,所以推荐你用CakePHP1.2

TOP

TOP

发新话题