一、典型cakephp处理 request 的流程
? ?当人浏览网站,发出请求,.htaccess文件将request映射到webroot/index.php文件,此文件中主要处理:1.常量的定义;2.包含bootstrap.php文件;3.调用 dispather() 函数。
?
二、认识 router 与 dispatcher、controller 之间的关系
? ?(1). 路由(router)从url中解释并提取出这次请求的参数:控制器(controller)、动作(action)以及其他在这次请求中关联影响到得业务逻辑的所有其他参数信息;
? ?(2).使用路由后,请求的url被映射到一个控制器的动作中(在特定的一个控制器类得一个方法)
**** 部分函数解析 ****
1. router::parse($url)
? ? 根据提供的url,解析出对应的controller、action、params 的数组。所依据的准则:默认路由、新定义创建的路由规则。
?
?
2. router::getargs($args, $options = array()) 将passed params 转换为参数
?
三、cakephp 中router 配置
? cakephp 源码包中 router.php 文件:
自定义路由:
connect() 函数的三个参数:1. 你希望匹配的url值;2. 自定义的路由元素的默认值;3. 帮助该路由器匹配的url元素的正则规则。
基本格式用于router定义:
?
router::connect( 'url', array('paramname' => 'defaultvalue'), array('paramname' => 'matchingregex'));
?
?
注:
(1) 定义url类型。url通常由斜杠分割的,但是也会包含一些通配符(*)或者自定义路由元素(url元素以冒号为前缀),用通配符来匹配url的类型。特殊化的路由元素允许你为你的控制器actions收集参数。
(2) 当请求出现时,这些路由元素的值会在控制器的 $this->params 存在。这不同于命名参数 (named parameter),所以注意区别:命名参数 (/controller/action/name:value) 存在于 $this->passedargs 中,而自定义路由元素存在于 $this->params 中
?(3) 默认路由:/:controller、 /:controller/:action/*
?
?这样的配置会返回什么呢???
?写两个例子看一下:
?
四、 cakephp 中router 的应用
(1). 简单应用:
(2). 高级应用:
? ?slugroute的解析方法很简单。首先我们调用父类parse()函数,可得到解析正则表达式的路径。任何空的或false的返回都会导致我们解析路径失败(路径不匹配),只有当我们得到有效的路径(对于post带有匹配的参数).自从cakeroute:parse()将已经创造了参数,所以我们不需要修改参数,就返回他们如果没有目标存在或返回错误。
? ?在app/config/routes.php中引用此router类:
?
五、 cakephp 中router 配置文件的弊端
? ? cakephp的缺省实现中,我们并不用去设置route,系统会遵循/controller/action/param的形式去解析url。但是很多时候这样的url并不友好,于是我们就要设置自定义的route,其结果就是route配置文件不断膨胀。值得注意的是php对于每个请求都要重建运行环境,而对于一次请求而言,route配置文件里最后使用的只是一条配置而已,为了这一条配置,却不得不重复解析整个庞大的route配置文件,无疑是个巨大的负担。
? ? rest风格是解决这个问题的好办法,采用rest风格的架构方式,资源的url形式相对确定,操作方式由http方法而定,因此route配置文件会迅速瘦身。
? rest软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是http协议。通常我们把rest也写作为rest/http,在实际中往往把rest理解为基于http的rest软件架构,或者更进一步把rest和http看作为等同的概念。
