thinkPHP定义路由

URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。

我们在路由定义文件(application/route.php)里面添加一些路由规则,如下:

return [ // 添加路由规则 路由到 index控制器的hello操作方法 'hello/:name' => 'index/index/hello',];

该路由规则表示所有hello开头的并且带参数的访问都会路由到index控制器的hello操作方法。

路由之前的URL访问地址为:

http://tp5.com/index/index/hello/name/thinkphp

定义路由后就只能访问下面的URL地址

http://tp5.com/hello/thinkphp

注意


定义路由规则后,原来的URL地址将会失效,变成非法请求。

但这里有一个小问题,如果我们只是访问

http://tp5.com/hello

将发生错误,

事实上这是由于路由没有正确匹配到,我们修改路由规则如下:

return [ // 路由参数name为可选 'hello/[:name]' => 'index/hello',];

使用[]把路由规则中的变量包起来,就表示该变量为可选,接下来就可以正常访问了。

http://tp5.com/hello

name参数没有传入值的时候,hello方法的name参数有默认值World,所以输出的内容为 Hello,World!

除了路由配置文件中定义之外,还可以采用动态定义路由规则的方式定义,例如在路由配置文件(application/route.php)的开头直接添加下面的方法:

use think\Route;Route::rule('hello/:name', 'index/hello');

完成的效果和使用配置方式定义是一样的。

无论是配置方式还是通过Route类的方法定义路由,都统一放到路由配置文件application/route.php文件中,具体原因后面会揭晓。

提示:


注意路由配置不支持在模块配置文件中设置。

完整匹配

前面定义的路由是只要以hello开头就能进行匹配,如果需要完整匹配,可以使用下面的定义:

return [    // 路由参数name为可选    'hello/[:name]$' => 'index/hello',];

当路由规则以$结尾的时候就表示当前路由规则需要完整匹配。

当我们访问下面的URL地址的时候:

http://tp5.com/hello // 正确匹配http://tp5.com/hello/thinkphp // 正确匹配http://tp5.com/hello/thinkphp/val/value // 不会匹配

闭包定义

还支持通过定义闭包为某些特殊的场景定义路由规则,例如:

return [    // 定义闭包    'hello/[:name]' => function ($name) {        return 'Hello,' . $name . '!';    },];

或者

use think\Route;Route::rule('hello/:name', function ($name) { return 'Hello,' . $name . '!';});

提示:


闭包函数的参数就是路由规则中定义的变量。

因此,当访问下面的URL地址:

http://tp5.com/hello/thinkphp

会输出

Hello,thinkphp!

设置URL分隔符

如果需要改变URL地址中的pathinfo参数分隔符,只需要在应用配置文件(application/config.php)中设置:

// 设置pathinfo分隔符'pathinfo_depr'          => '-',

路由规则定义无需做任何改变,我们就可以访问下面的地址:

http://tp5.com/hello-thinkphp

路由参数

我们还可以约束路由规则的请求类型或者URL后缀之类的条件,例如:

return [    // 定义路由的请求类型和后缀    'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],];

上面定义的路由规则限制了必须是get请求,而且后缀必须是html的,所以下面的访问地址:

http://tp5.com/hello // 无效http://tp5.com/hello.html // 有效http://tp5.com/hello/thinkphp // 无效http://tp5.com/hello/thinkphp.html // 有效

更多的路由参数请参考完全开发手册的路由参数一节。

变量规则

接下来,我们来尝试一些复杂的路由规则定义满足不同的路由变量。在此之前,首先增加一个控制器类如下:

<?phpnamespace app\index\controller;class Blog{    public function get($id)    {        return '查看id=' . $id . '的内容';    }    public function read($name)    {        return '查看name=' . $name . '的内容';    }    public function archive($year, $month)    {        return '查看' . $year . '/' . $month . '的归档内容';    }}

添加如下路由规则:

return [ 'blog/:year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']], 'blog/:id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']], 'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],];

在上面的路由规则中,我们对变量进行的规则约束,变量规则使用正则表达式进行定义。

我们看下几种URL访问的情况

// 访问id为5的内容http://tp5.com/blog/5 // 访问name为thinkphp的内容http://tp5.com/blog/thinkphp // 访问2015年5月的归档内容http://tp5.com/blog/2015/05 

路由分组

上面的三个路由规则由于都是blog打头,所以我们可以做如下的简化:

return [ '[blog]' => [ ':year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']], ':id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']], ':name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']], ],];

对于这种定义方式,我们称之为路由分组,路由分组一定程度上可以提高路由检测的效率。

复杂路由

有时候,我们还需要对URL做一些特殊的定制,例如如果要同时支持下面的访问地址

http://tp5.com/blog/thinkphp http://tp5.com/blog-2015-05 

我们只要稍微改变路由定义规则即可:

return [ 'blog/:id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']], 'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']], 'blog-<year>-<month>' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],];

对 blog-<year>-<month> 这样的非正常规范,我们需要使用<变量名>这样的变量定义方式,而不是 :变量名方式。

简单起见,我们还可以把变量规则统一定义,例如:

return [    // 全局变量规则定义    '__pattern__'         => [        'name'  => '\w+',        'id'    => '\d+',        'year'  => '\d{4}',        'month' => '\d{2}',    ],    // 路由规则定义    'blog/:id'            => 'blog/get',    'blog/:name'          => 'blog/read',    'blog-<year>-<month>' => 'blog/archive',];

__pattern__中定义的变量规则我们称之为全局变量规则,在路由规则里面定义的变量规则我们称之为局部变量规则,如果一个变量同时定义了全局规则和局部规则的话,当前的局部规则会覆盖全局规则的,例如:

return [ // 全局变量规则 '__pattern__' => [ 'name' => '\w+', 'id' => '\d+', 'year' => '\d{4}', 'month' => '\d{2}', ], 'blog/:id' => 'blog/get', // 定义了局部变量规则 'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w{5,}']], 'blog-<year>-<month>' => 'blog/archive',];

【 5.1 】使用须知


5.1的路由配置文件改为route/route.php,并且支持随意命名,都会自动加载。并尽量使用方法注册路由的方式替代数组配置的方式,例如。

use think\facade\Route;Route::get('blog/:id','blog/get');Route::get('blog/:name','blog/read');
(0)

相关推荐

  • TP5(ThinkPHP)查看具体的版本号

    TP5查看程序的具体版本号有三种方法: 在控制器中查看版本号 保存文件,在浏览器查看打印结果 在模板中查看版本号,第一步,渲染模板 第二步,编写模板 在浏览器查看模板中返回的版本号 在文件中,查看TP ...

  • 规则路由

    规则表达式 规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式: 'my' => 'Member/myinfo', // 静态地址路由'blog/:id' ...

  • 【Linux笔记】make工程管理工具(二)

    make和Makefile(或者makefile)文件提供了一种简单有效的工程管理方式.Makefile文件是一个决定着如何编译工程的文本,有一定的书写规则.make是一个GNU命令工具,用来解释Ma ...

  • URL生成

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 定义规则 ...

  • thinkphp5.1中使用链式操作的坑

    thinkphp5.1中使用链式操作的坑

  • 闭包支持

    闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了 参数传递 闭包定义的参数传递在规则路由和正则路由的两种情况下有所区别. 规则路由 规则路由的参数传递比较简单: ...

  • 路由定义

    启用路由 要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),并且在应用(或者模块)配置文件中开启路由: // 开启路由'UR ...

  • 编程语言Thinkphp入门3—框架模板、变量(47)

    [在控制器调用模板] display() 调用当前操作名称的模板 display('名字') 调用指定名字的模板文件 控制器调用模板四种方式: [在控制器给模板传递变量] 在smarty里边给模板传递 ...

  • 编程语言ThinkPHP路由详解

    编程语言ThinkPHP路由详解 ThinkPHP路由通俗的说,他是一个url的传输规则,例如:index.php?g=Homem=Indexa=price 这个规则也是可以变化的, 可以设置为@或者 ...

  • 镜空演绎:春风表意,奢华定义丨巴迪斯设计

    以人为本·极简生活 生活·镜空演绎 LIFE IN BARDISS 本案例采用现代极简风格, 在现代匆忙的都市生活里构筑理想的宜居范例. 追求精致,追求自由, 追求一种与众不同的美好生活. 温馨精致的 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • 重点好文!!三级医院定义!6家医院被降级!

    作者|徐毓才 来源|看医界(ID:vistamed) 4月30日,太原市6家医院被当地卫生行政部门发文调低级别等次.其中4所医院因为评审结论已超过两个评审周期且未完成等级医院评审,1家医院在等级医院评 ...

  • 身和体的定义及用法

    ​易山/文 盲派命法,身旺不旺无所谓,体旺就行,体旺也能做事. 身:指日干. 体:指印比食伤禄(除财官以外的神). 身和体是取得财官的工具. 我的体能制住财官,我能踏实干事,能担当.制不住财官,偷奸耍 ...

  • 福建省税务局:税法对于企业集团的定义

    税法对于企业集团的定义. 留言时间:2021-04-25 纳税人所属地 福建 问题内容 <财政部 国家税务总局关于全面推开营业税改征增值税试点的通知>(财税[2016]36号 )规定&qu ...

  • Go map定义的几种方式以及修改技巧

    原文链接:http://www.zhoubotong.site/post/24.html 直入正题,我们看下以下代码: package mainimport ( "encoding/json ...

  • 人力资本的定义?

    如果你使用Google查找"人力资本定义"定义,你会感到惊讶和不知所措,你会获得大量且矛盾的定义,坦率地说不是很有帮助,因为他们没有确切说明它到底是什么. 对我而言,人力资本的定义 ...