thinkphp学习笔记10—看不懂的路由规则
路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂。
1.路由定义
要使用路由功能需要支持PATH_INFO,PATH_INFO是什么呢?手册中提到“要使用路由功能,前提是你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能),” , url支持path_info,不是apache要支持path_info么,度娘讲的还算清楚一点,见下文:
pathinfo
(PHP 4 >= 4.0.3, PHP 5)
pathinfo -- 返回文件路径的信息
说明
array pathinfo ( string path [, int options] )
pathinfo() 返回一个关联数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。
可以通过参数 options 指定要返回哪些单元。它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元。
例子 1. pathinfo() 例子
<?php
$path_parts = pathinfo("/www/htdocs/index.html");
echo $path_parts["dirname"] . "\n";
echo $path_parts["basename"] . "\n";
echo $path_parts["extension"] . "\n";
?>
上例将输出:
/www/htdocs
index.html
html
我去写这段的时候在我的机器上没有输出任何内容,后来我在php安装目录下找到php.ini开启了cgi.fix_pathinfo=1,然后确实能够输出上面的内容。
但是这只是讲了一个函数的用法,就是pathinfo这个函数会返回一个数组,里面有三个元素分别是
dirname:我的理解,服务器名称加上路径,
basename:访问的文件名,
extension:文件的扩展名
服务器支持后还需要在配置文件中打开相应的配置,
// 开启路由
'URL_ROUTER_ON' => true,
这个配置在ThinkPHP\Conf\convention.php文件中也有定义,不过可以在模块的配置文件中覆盖它。然后就是定义路由规则了,路由的匹配是按照先到先得的顺序来进行的,在第一次匹配成功之后就不会再次匹配了,而是访问这个路由中的控制器和方法,并传入参数,得到结果。
路由规则定义的格式是:'路由表达式'=>'路由地址和传入参数' 或 array('路由表达式','路由地址','传入参数')
路由表达式包含规则路由和正则路由
表达式 示例
正则表达式 /^blog\/(\d+)$/
规则表达式 blog/:id
路由地址表示当前路由表达式需要路由到的地址,包含内部地址和外部地址,并允许隐式传入url里面没有的参数,允许使用字符串或者数组的方式定义,特殊情况下可采用闭包函数定义路由功能,支持下面6中方式定义,
| 定义方式 | 定义格式 |
|---|---|
| 方式1:路由到内部地址(字符串) | '[分组/模块/操作]?额外参数1=值1&额外参数2=值2...' |
| 方式2:路由到内部地址(数组)参数采用字符串方式 | array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...') |
| 方式3:路由到内部地址(数组)参数采用数组方式 | array('[分组/模块/操作]',array('额外参数1'=>'值1','额外参数2'=>'值2'...)[,路由参数]) |
| 方式4:路由到外部地址(字符串)301重定向 | '外部地址' |
| 方式5:路由到外部地址(数组)可以指定重定向代码 | array('外部地址','重定向代码'[,路由参数]) |
| 方式6:闭包函数 | function($name){ echo 'Hello,'.$name;} |
完全不懂啊!内部地址,外部地址?什么概念呢局域网中的地址吗?192.168.0.1这样的?大学学的都忘记了,百度了一下,貌似这样的,有三类内部地址,用来连接局域网中的设备,包含打印机等?
路由以http或者/开头的话会被认为是一个外部地址或者重定向地址,例如
'blog/:id'=>'/blog/read/id/:1' 采用301重定向的方式路由跳转,这种方式的好处是url可以比较随意,包括在url里面传入更多的非标准格式参数,擦完全不懂的,非标准格式参数为何物?太tm专业了。
'blog/:id'=>'blog/read':只支持模块和操作地址,例如我们希望avatar/123重定向到/member/avatar/id/123_small只能使用'avatar/:id'=>'/member/avatar/id/:1_small' 貌似:id代表一个参数,参数名字是id。路由地址采用重定向地址的话,如果要引用动态变量,也是采用 :1、:2 的方式。采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,例如:'blog/:id'=>'http://blog.thinkphp.cn/read/:1' 表示当前网站(可能是http://thinkphp.cn)的 blog/123 地址会直接重定向到 http://blog.thinkphp.cn/read/123。
2.规则路由
规则表达式包含静态地址和动态地址,或者是两种地址的结合,如下:
"my" => "Member/myinfo", //静态路由地址
"blog/:id" => "blog/read", //静态地址和动态地址结合,
"new/:year/:month/:day" => "news/read", //静态地址和动态地址的结合
":user/:blog_id" => "Blog/read", //全动态地址
参数里面以“:”开头的就是动态参数,自动对应一个get参数,例如":id"表示此处可以使用$_GET['id']来获取参数,而":year",":month",":day"分别对应$_GET['year'],$_GET['month'],$_GET['day']来获取。
数字约束:支持对变量类型检测,目前仅仅支持对数字类型的约束定义,例如'blog/:id\d'=>'blog/read',表示只匹配数字参数,
函数支持:可以支持对路由变量的函数过滤,例如'blog/:id\d|md5' => 'blog/read',表示对匹配到的变量进行md5处理,实际传入read操作方法的$_GET['id'],其实是md5($_GET['id']),不支持对变量使用多次函数处理和函数额外参数处理。
thinkphp学习笔记10—看不懂的路由规则的更多相关文章
- thinkphp学习笔记1—目录结构和命名规则
原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...
- thinkphp学习笔记7—多层MVC
原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...
- thinkphp学习笔记6—url模式
原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...
- thinkphp学习笔记4—眼花缭乱的配置
原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...
- Hadoop学习笔记(10) ——搭建源码学习环境
Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- thinkphp学习笔记9—自动加载
原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...
- thinkphp学习笔记8—命名空间
原文:thinkphp学习笔记8-命名空间 新版本(3.2)中采用命名空间的方式定义和加载类库文件,解决多个模块之间的冲突问题,并实现了更加高效的自动加载机制. 需要给类库定义所在的命名空间,命名空间 ...
随机推荐
- win10无法新建文件夹怎么办 win10右键新建菜单设置方法
有朋友安装了win10系统后发现右键菜单中没有新建项,而平时使用新建 - 文件夹项的机率很高.如何才能恢复桌面右键菜单中的新建项呢? 右键点击桌面空白处,在右键菜单中发现没有新建项: 桌面右键菜单没有 ...
- Android项目包装apk和apk反编译,xml反编译
一.项目和一般原则其不足之处包 (1)开发一个简单的项目.当发布了APK档.假设我们不使用签名的方式,直接地bin文件夹中找到*.apk档.非常方便,但是,当我们在使用的用户,可能有其他方案覆盖安装. ...
- python 凸包(经纬度) + 面积[近似]
def cross(A,B): return A[0] * B[1] - A[1] * B[0] def vectorMinus( a , b): return ( (a[0] - b[0] )*10 ...
- 【原创】leetCodeOj --- Find Peak Element 解题报告
题目地址: https://oj.leetcode.com/problems/find-peak-element/ 题目内容: A peak element is an element that is ...
- Eclipse——热键&Help
版权声明:本文博主原创文章.博客,未经同意不得转载.
- 应对黑客攻击SQL SERVER数据库中的一个案例
最近发现挂在网上server不知怎的,重新启动,那server现在主要是开始IIS服务,SQL SERVER 服务. 远程登录.发现系统响应十分缓慢.一个明显的停滞感,打开任务管理器,CPU在基本用法 ...
- Unity判断网络连接类型
使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G using UnityEngine; using System.Collections; public ...
- 《Linux Device Drivers》第十六章 块设备驱动程序——note
基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...
- 开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
原文:[原创]开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式 开源Math.NET基础数学类库使用系列文章总目录: 1.开源.NET基础数学计算组件Math. ...
- 1号店Interview小结
三大范式: 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范 ...