原文: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—看不懂的路由规则相关推荐

  1. 学习笔记(10):第一章: 路由与模板-Web前端技术与框架 5

    立即学习:https://edu.csdn.net/course/play/25568/305976 JQuiery

  2. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  3. 台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning

    台大李宏毅Machine Learning 2017Fall学习笔记 (10)Tips for Deep Learning 注:本博客主要参照 http://blog.csdn.net/xzy_thu ...

  4. 【日志】学习笔记之看图玩转LTM

    学习笔记之看图玩转LTM (不知道怎么回事发上来 图片显示的这么小 不过点击就可以在新窗口里看到大图了) 摘要:TRDB_LTM是友晶科技公司最新推出的 4.3 英吋数字 LCD 触碰面板套件,可以通 ...

  5. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

  6. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  7. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  8. Hadoop学习笔记—10.Shuffle过程那点事儿

    Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...

  9. Linux学习笔记10

    Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...

最新文章

  1. 一道面试题:js返回函数, 函数名后带多个括号的用法及join()的注意事项
  2. Ubuntu网络设置
  3. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法
  4. 神经网络“天生”就会驾驶虚拟赛车
  5. WSGI 是什么?和nginx有什么关系?
  6. Best Time to Buy and Sell Stock
  7. Hulu直播服务难点解析(三):关键收获
  8. jvm类加载过程_JVM类生命周期概述:加载时机与加载过程
  9. JavaScript依赖注入的实现思路
  10. ASP.NET URL重写浅析
  11. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
  12. linux 安装 maven
  13. 外省市机动车驾驶证换领本市机动车驾驶证
  14. 程设项目二:圣杯战争
  15. win7此计算机无法加入家庭组,Win7系统无法加入家庭组问题的解决方法
  16. 面试的一般流程及其常见的问题
  17. 虚幻引擎5 C++编程学习
  18. 独孤思维:自动裂变赚钱项目,新手小白每月轻松5000+
  19. VC++ RLE压缩算法(附源码)
  20. 计算机要大牛 掌握的方法【上】写的很全面,收藏

热门文章

  1. 【干货】百度联合清华大学发布国内首个基于AI实践的《产业智能化白皮书》(附报告全文)...
  2. Google联手Facebook 要在AI研究上搞什么大事?
  3. 高通5G版图现身!你的网络生活将迎来巨变?
  4. 全球自动驾驶汽车发展指数哪家强?美德领衔,中国第七
  5. “金三银四”跳槽需谨慎(送福利礼包)!
  6. IDC报告:欧洲区块链支出8亿美元,排在首位
  7. 昊天善圈浅谈比特币这个类型区块链应用技术的特点及作用
  8. OSPF多区域;特殊区域;
  9. 快速排序的递归和非递归
  10. 微信小程序小结02-- 完整的demo