tp3.2.3 路由模块

本文详细介绍了ThinkPHP3.2.3的路由定义,包括规则路由、正则路由和闭包支持。通过开启路由,规则路由如`/read/:id`可以将URL映射到特定方法,正则路由支持更复杂的匹配,闭包路由允许直接处理请求,不需控制器。通过示例展示如何传递参数和控制流程,解析不同URL如何匹配路由规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.路由定义

    开启路由

'URL_ROUTER_ON'   => true, //开启路由
'URL_ROUTE_RULES' => array( //定义路由规则 
    'new/:id\d'    => 'News/read',
    'new/:name'    => 'News/read',
    'new/:year\d/:month\d'  => 'News/archive',
),

1.规则路由

每个参数中以“:”开头的参数都表示动态参数
下面代码表示传的值有 new  、$_GET['year']、$_GET['month']、$_GET['day'] 

  =>之后表示匹配的路由发送到哪个方法 规则表达式的定义始终以“/”为参数分割符

'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合

规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以使用$符号,例如:

'new/:cate$'=> 'News/category'

 *  http://serverName/index.php/Home/new/info

        会匹配成功,而

    http://serverName/index.php/Home/new/info/2

        则不会匹配成功。

2.正则路由

    路由表达式支持的正则定义必须以“/”开头,否则就视为规则表达式。

'#^blog\/(\d+)$#' => 'Blog/read/id/:1'//错误

'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month=:2', //正确

3.闭包支持

我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:

'URL_ROUTE_RULES'=>array(
    'test'        => 
        function(){ 
            echo 'just test';
        },
    'hello/:name' => 
        function($name){ 
            echo 'Hello,'.$name;
        }
)

规则路由的参数传递比较简单:

'hello/:name' => 
    function($name){ 
        echo 'Hello,'.$name;
    }

如果多个参数可以使用:

'blog/:year/:month' => 
    function($year,$month){ 
        echo 'year='.$year.'&month='.$month;
    }

如果是正则路由的话,闭包函数中的参数就以正则中出现的参数次序来传递,例如:

'/^new\/(\d{4})\/(\d{2})$/' => 
    function($year,$month){ 
        echo 'year='.$year.'&month='.$month;
    }

默认的情况下,使用闭包定义路由的话,一旦匹配到路由规则,执行完闭包方法之后,就会中止后续执行。如果希望闭包函数执行后,后续的程序继续执行,可以在闭包函数中使用布尔类型的返回值,例如:

'hello/:name' => 
    function($name){ 
        echo 'Hello,'.$name.'<br/>';
        $_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;
        return false;
    }

该路由定义中的闭包函数首先执行了一段输出代码,然后重新设置了$_SERVER['PATH_INFO']变量,交给后续的程序继续执行,因为返回值是false,所以会继续执行控制器和操作的检测,从而会执行Blog控制器的read操作方法。

假设blog控制器中的read操作方法代码如下:

public function read($name){
    echo 'read,'.$name.'!<br/>';
}

如果我们访问的URL地址是: http://serverName/Home/hello/thinkphp

则浏览器输出的结果是:

Hello,thinkphp
read,thinkphp!

4.实例

'URL_ROUTER_ON'   => true, //开启路由
'URL_ROUTE_RULES' => array( //定义路由规则 
    'new/:id\d'    => 'News/read',
    'new/:name'    => 'News/read',
    'new/:year\d/:month\d'  => 'News/archive',
),

然后,我们访问: http://serverName/index.php/Home/new/8

会匹配到第一个路由规则,实际执行的效果等效于访问: http://serverName/index.php/Home/News/read/id/8

当访问: http://serverName/index.php/Home/new/hello

会匹配到第二个路由规则,实际执行的效果等效于访问: http://serverName/index.php/Home/News/read/name/hello

那么如果访问: http://serverName/index.php/Home/new/2012/03

是否会匹配第三个路由规则呢?我们期望的实际执行的效果能够等效于访问: http://serverName/index.php/Home/News/archive/year/2012/month/03

事实上却没有,因为http://serverName/index.php/Home/new/2012/这个URL在进行路由匹配过程中已经优先匹配到了第一个路由规则了,把2012当成id的值传入了



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值