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');
转载于:https://www.cnblogs.com/xu1115/p/10977620.html
thinkPHP定义路由相关推荐
- ThinkPHP框架路由验证器优先于路由中间件执行的解决方案
ThinkPHP框架路由验证器优先于路由中间件执行的解决方案 打个广告先:北京有没有在招PHP的公司,失业中... 前段时间在写项目的时候需求是先验证用户是否登录并且有该接口访问权限然后在验证访问参数 ...
- php url路由入门实例,ThinkPHP URL 路由实例
以本文开始的例子为例,看该路由是如何定义的.在项目配置文件 Conf/config.php 里定义如下规则: //路由定义 'URL_ROUTE_RULES'=> array( 'product ...
- tp5子域名index.php,tp5实现绑定子域名,并且根据子域名定义路由规则
tp5实现绑定子域名,并且根据子域名定义路由规则 发布时间:2020-10-03 TP5的路由规则,可以绑定子域名到对应的模块,然后根据域名不同,使用不同的路由规则 use \think\Route; ...
- WPF之定义路由事件 http://www.51zxw.net/study.asp?vip=8963801
[url=http://www.51zxw.net/study.asp?vip=8963801] 学IT必看,[经典] [基础] [进阶] [实践 ] [成神][超神][返璞归真] [/url] us ...
- php yii框架路由,yii框架怎样定义路由_PHP开发框架教程
路由和URL生成 当一个YII运用入手下手处置惩罚一个请求的时刻,它首先要做的就是将请求的URL转化成一个路由.路由的作用是用于后续实例化相应的控制器和操纵,以便处置惩罚请求,全部处置惩罚历程便叫做路 ...
- php全局变量作用域,thinkphp定义全局变量
本文收集整理关于thinkphp定义全局变量的相关议题,使用内容导航快速到达. 内容导航: Q1:thinkphp 视图模型中怎么用全局变量或者是点语法 先说下,关联模型.如你所说,关联模型和jion ...
- ionic中定义路由的问题
最近做一个ionic的app项目,发现ionic的路由方式并不是很灵活.期间在路由跳转上遇到了很多的问题,这里直接上问题: 1. 在这个app中,我要实现除了首页.分类页.购物车.个人中心这4个页 ...
- nest定义路由和路由失效的问题
1.在src/创建文件cats.controller.ts import { Controller, Get } from '@nestjs/common'; @Controller('cats') ...
- vue/cli是什么?vue/cli如何使用? 入门篇(安装创建,组件使用,定义路由,项目导出) ∠( °ω°)/ 前端知识
文章目录 简介 安装 安装nodejs nvm npm换源 单次换源 永久换源 方法一 方法二 Vue/cli安装 创建Vue/cli项目 解决常见错误 用命令行创建项目 可视化界面创建 项目目录简介 ...
最新文章
- Hadoop 源码分析(二四)FSNamesystem
- “现金贷”产品的获客之道,这一篇就够了!
- python需要背的英语单词怎么写_学Python必须背的42个常见单词,看看你都会吗?...
- mysql with as 用法_Python之图解with语句
- html中加入scrip代码,HTML script 标签 | 菜鸟教程
- Jquery一些常用的方法
- php mysql开发技术_PHP和Mysqlweb应用开发核心技术 第1部分_php
- 高,低电平复位电路原理及加电容的作用
- 霆智服务器安装步骤_阿里云服务器安装MySql数据库详细步骤
- 基于IBM Bluemix的数据缓存应用实例
- 什么是JavaSE,写给第一次接触Java的人
- 软件使用经验合集(操作系统、常用软件)
- 将Imagenet2012比赛数据解析为图像
- android 火车购票功能,12306 火车票订票
- 转载:编剧技巧思路乱谈
- Javascript 获得当前文件的url 目录,不含文件名
- SpringBoot 封装返回类报错:No converter found for return value of type
- 大数据思维养成从认识大数据的本质开始
- 机器学习——集成学习之 AdaBoosting
- 怎样获取商品历史价格信息API接口
热门文章
- 物联网平台发展前景如何快速发展
- L2-015 互评成绩(排序)
- 数据库oracle有哪些函数,Oracle函数大全
- 起床困难综合症(位运算)
- spark to mysql date_[Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:
- SparkSql引起的一场灾难
- python︱写markdown一样写网页,代码快速生成web工具:streamlit lay-out布局(四)
- 极简主义︱使用Turicreate进行快速图像分类迁移训练与预测(六)
- OpenCV基本图形绘制之绘制直线
- SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句