thinkPHP5框架路由常用知识点汇总

本文实例讲述了thinkPHP5框架路由常用知识点。分享给大家供大家参考,具体如下:

一、路由的模式

普通模式(默认pathinfo,不解析路由)

'url_route_on' => false

混合模式(pathinfo+解析路由)

'url_route_on' => true,
'url_route_must'=> false,

强制模式(必须路由)

'url_route_on' => true,
'url_route_must' => true,

二、动态注册路由

1、动态注册路由

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

实例

return [
Route::rule('demo/:name/[:sex]', 'index/Index/demo', 'GET', ['ext' => 'html'], ['name' => '\w+', 'age' => '\w{1,2}']),
]

路由表达式:demo/:name/[:sex](”[]“为可选)
路由地址:/index/Index/demo
请求类型:get|post| 等
路由参数:['ext'=>'html'](后缀检测)等等
变量规则:['sex'=>'0|1'](只能为0和1)等等,正则表达式

//根路径下使用闭包
Route::get('/', function () {
 echo '我是demo3,临时维护,谢谢支持!';
}),
//301重定向
// Route::get('demo4', 'http://www.baidu.com'),

2、数组方式动态注册路由(简洁)

return [
//pattern全局变量
'__pattern__' => [
 'name' => '\w+',
 ...
],
'demo2' => 'admin/Index/demo2',
'demo3/:name/:age' => ['admin/Index/demo3', ['method' => 'get', 'ext' => 'asp'], ['age' => '\d+']],
'demo4/:name/:money' => ['admin/Index/demo4', ['method' => 'get', 'ext' => 'asp'], ['money' => '\d+']],
'demo5/:name' => ['admin/Index/demo5', ['method' => 'get', 'ext' => 'php'], []],
];

三、路由分组

个人:同一个路由定义(demo),根据URL传递参数的值的不同,而匹配不同的变量规则,从而进入不同的路由规则。例如以下

①逐条

'demo/:num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
'demo/:str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
'demo/:bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],

②合并

'[demo]' => [
 ':num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
 ':str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
 ':bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],
],

③使用group分组注册

//Route::group('路由表达式','对路由的定义');
think\Route::group('demo', [
 ':num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
 ':str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
 ':bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],
]);

④从③提取共同的部分——简化

think\Route::group('demo', [
 ':num' => 'demo1',
 ':str' => 'demo2',
 ':bool' => 'demo3',
], ['method' => 'get', 'prefix' => 'admin/Index/'], ['num' => '\d{2,4}', 'str' => '[a-zA-Z]+', 'bool' => '0|1']);

⑤路由分组闭包嵌套

个人:和第④的路由功能基本一致,如果不是什么特别需求或者习惯使用闭包,就少用或不用吧

Route::group(['method'=>'get','ext'=>'html'],function(){
  Route::group('blog',function(){
    Route::any('blog/:id','blog/read',[],['id'=>'\d+']);
    Route::any('blog/:name','blog/read',[],['name'=>'\w+']);
  }
});

三、路由绑定

1、绑定到模块/控制器/操作(最多绑定到操作级)

// 绑定当前的URL到 index模块
Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
Route::bind('index/blog/read');

个人:到目前为止路由绑定的效果使用动态注册路由没差别,不过这里不需要定义路由表达式,即简单迅捷

http://serverName/index/blog/read/id/5

http://serverName/read/id/5

个人:但路由绑定+注册路由可以将 模块、控制器、方法、传递的参数名 全部隐藏,而只注册路由的话只能隐藏 模块、控制器、传递的参数名,还存在一个路由表达式

Route::get('index/blog/:id','index/blog/read');

http://serverName/5

2、绑定到命名空间

个人: 这一个绑定十分的省事,原先做项目时模型和控制器啥的都需要在最上面进行命名空间声明,而使用命名空间绑定,一个模块只需要两句,两个模块四句,岂不是超级全局变量?不过单从URL上来说只省略了模块这一层。

//绑定到命名空间
Route::bind('\app\index\controller','namespace');

只需

http://serverName/blog/read/id/5

就可以直接访问 \app\index\controller\Blog类的read方法。

3、绑定到类

个人:相比命名空间,这里单从URL来说省略了模块、控制器两层。类似命名空间,单这里针对的这是控制器层,而命名空间针对的是模块层

// 绑定到类
Route::bind('\app\index\controller\Blog','class');

只需

http://serverName/read/id/5

就可以直接访问 \app\index\controller\Blog类的read方法。

注:绑定到命名空间和类之后,不会进行模块的初始化工作。

4、入口文件绑定

个人:如果我们使用入口文件绑定,绑定一个模块,同时取消多模块访问配置↓,也就意味着,就算你在项目里放了再多项目也只会访问一个。想要访问其他模块只需要在入口文件改下名字即可。甚至可以使用一个空模块。将入口文件绑定为空模块将实现项目下线功能。

// 是否支持多模块
'app_multi_module' => true,

只需要入口文件添加BIND_MODULE常量,即可把当前入口文件绑定到指定的模块或者控制器,例如:

如果我们需要给某个入口文件绑定模块,可以使用下面两种方式:

①常量定义

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 绑定到index模块
define('BIND_MODULE','index');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

②自动入口绑定

个人:顾名思义,和①功能一样,只是这个连绑定都不需要。只需要打开↓配置即可

// 入口自动绑定模块
'auto_bind_module' => false,

四、域名路由

// blog子域名绑定到blog模块
Route::domain('blog','blog');
// blog子域名绑定到blog模块,并添加默认参数
Route::domain('blog','blog?var=thinkphp');

// 原来的URL访问
http://www.thinkphp.cn/blog/article/read/id/5
// 绑定到blog子域名访问
http://blog.thinkphp.cn/article/read/id/5
// blog子域名绑定到index模块的blog控制器
Route::domain('blog','index/blog');

// 原来的URL访问
http://www.thinkphp.cn/index/blog/read/id/5
// 绑定到blog子域名访问
http://blog.thinkphp.cn/read/id/5
// 完整域名绑定到admin模块
Route::domain('admin.thinkphp.cn','admin');
// IP绑定到admin模块
Route::domain('114.23.4.5','admin');

泛域名部署

二级泛域名

// 绑定泛二级域名域名到book模块
Route::domain('*','book?name=*');

并且可以直接通过$_GET['name']变量 获取当前的泛域名。

下面的URL访问都会直接访问book模块

http://hello.thinkphp.cn
http://quickstart.thinkphp.cn

三级泛域名

// 绑定泛三级域名到user模块
Route::domain('*.user','user?name=*');

如果我们访问如下URL地址:

http://hello.user.thinkphp.cn
的同时,除了会访问user模块之外,还会默认传入 $_GET['name'] = 'hello'

在配置传入参数的时候,如果需要使用当前的泛域名作为参数,可以直接设置为“*”即可

TP5手册:https://www.kancloud.cn/manual/thinkphp5/118029

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(0)

相关推荐

  • thinkphp5 URL和路由的功能详解与实例

    前面的话 本文将详细介绍thinkphp5URL和路由 URL访问 ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块.控制器和操作,下面是一个标准的URL访问格式: http://domainName/index.php/模块/控制器/操作 其中index.php就称之为应用的入口文件(注意入口文件可以被隐藏,后面会提到) 模块在ThinkPHP中的概念其实就是应用目录下面的子目录,而官方的规范是目录名小写,因此模块全部采用

  • 改写ThinkPHP的U方法使其路由下分页正常

    ThinkPHP3.1.3在启用路由的情况下,其分页地址不是路由的地址,由于thinkphp3.2.1的代码也没有修复,很多人都遇到了这一问题,本文采纳olcms的修改方法解决这一问题,特别感谢phper jack对此做出的贡献,具体解决办法是修改ThinkPHP的functions.php的U方法,在287行左右: if(!empty($vars)) { // 添加参数 foreach ($vars as $var => $val){ if('' !== trim($val)) $url .=

  • thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)

    复制代码 代码如下: <?php //thinkphp 路由定义规则  $route = array(  'news/:action/:year\d/:month/:day'=>'news/read?year=:2&month=:3&day=:4',    'news/:action^delete|update|insert/:year\d/:month/:day'=>array(                'news/read?extra=:2&status

  • ThinkPHP路由详解

    有了基本配置,我们就可以来访问我们的应用默认首页了.进入到项目目录,可以直接使用PHP内置服务器来开始访问,比如: php -S localhost:8999 浏览器输入localhost:8999就可以看到ThinkPHP的默认首页了:一个笑脸. 在这里,我们访问到的是ThinkPHP自带的默认入口文件index.php也就是访问到的是IndexController的index()方法,这是因为ThinkPHP默认设置: 'DEFAULT_CONTROLLER' => 'Index' 如果你查

  • thinkPHP5.1框架路由::get、post请求简单用法示例

    本文实例讲述了thinkPHP5.1框架路由::get.post请求简单用法.分享给大家供大家参考,具体如下: 1.在index模块下的控制器index里面建立一个type方法 public function type(){ var_dump(input()); echo '我是测试类型'; return view(); } 2.在index模块下新建view视图建立index文件夹创建type.html页面 <!DOCTYPE html> <html lang="en&quo

  • ThinkPHP路由机制简介

    本文实例讲述了ThinkPHP路由机制.分享给大家供大家参考,具体如下: ThinkPHP 支持 URL 路由功能,要启用路由功能,需要设置ROUTER_ON参数为true.开启路由功能后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向.路由功能需要定义路由定义文件,位于项目的配置目录下面,文件名为 routes.php 定义格式: Return Array( 'RouteName'=>array('模块名称','操作名称','参数定义','额

  • thinkphp的URL路由规则与配置实例

    本文实例讲述了thinkphp的URL路由规则与配置方法.分享给大家供大家参考.具体分析如下: 一.URL规则 1.默认是区分大小写的 2.如果我们不想区分大小写可以改配置文件 复制代码 代码如下: 'URL_CASE_INSENSITIVE'=>true,//url不区分大小写 3.如果模块名为 UserGroupAction,那么url找模块就必要要写成 复制代码 代码如下: http://localhost/thinkphp4/index.php/user_group/index 4.如果

  • ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼

    前言 读过一篇关于Zend Framework2的技术文章<ZF2多级树形路由Route配置实例>,是介绍路由配置的.我觉得很有意思,这是的需求: /user对应用户列表页面 /user/:user_id对应用户的个人主页,比如 /user/AlloVince 就对应AlloVince用户的个人主页 /user/:user_id/blog/对应用户的博客列表页面,比如 /user/AlloVince/blog 就会列出AlloVince写过的Blog /user/:user_id/blog/:

  • thinkphp中U方法按路由规则生成url的方法

    如下所示: //更改模块配置文件 'URL_ROUTER_ON' => true, 'URL_ROUTE_RULES'=>[]//编写路由优化 tp开启路由后,使用U方法是不会按路由规则生成url的,一般我们是要手动修改模版,把里面的U方法去掉,手动修改链接,如果是已经写好的程序,后期才添加路由,修改起链接就太麻烦了 今天无聊就修改了一下U方法,让它按路由规则生成url,再不用一条条修改模版了. 下面代码添加到 /ThinkPHP/Common/functions.php 文件,在U方法里面直

  • thinkPHP5框架路由常用知识点汇总

    本文实例讲述了thinkPHP5框架路由常用知识点.分享给大家供大家参考,具体如下: 一.路由的模式 普通模式(默认pathinfo,不解析路由) 'url_route_on' => false 混合模式(pathinfo+解析路由) 'url_route_on' => true, 'url_route_must'=> false, 强制模式(必须路由) 'url_route_on' => true, 'url_route_must' => true, 二.动态注册路由 1.

  • flask框架路由常用定义方式总结

    本文实例讲述了flask框架路由常用定义方式.分享给大家供大家参考,具体如下: 路由的各种定义方式 请求方式限定 使用 methods 参数指定可接受的请求方式,可以是多种 @app.route('/',methods=['GET']) def hello(): return '<h1>hello world</h1>' 路由查找方式 同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配 @app.route('/') def hello(): return '<h1&

  • thinkphp5框架路由原理与用法详解

    本文实例讲述了thinkphp5框架路由原理与用法.分享给大家供大家参考,具体如下: 路由理解 概括的说:路由就是网络请求的url与thinkphp应用层的逻辑处理地址的对应关系. 通俗的说:路由就是把url的请求优雅的对应到你想要执行的操作方法. 路由其实就是把真实的url地址隐藏起来,使用访问地址来访问应用(网站或OA等). 通常这样定义:"访问地址"=>"真实地址",这代表了一种映射关系.就好比用"1"代表去肯德基吃饭,用"

  • Spring框架学习常用注解汇总

    目录 类注解 方法或属性上注解 参数注解 类注解 @component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注. @Service 标注类,声明该类为业务层组件,用于处理业务逻辑 @Repositor 标注类,声明该类为持久层的接口.使用后,在启动主程序类上需要添加@MapperScan("xxx.xxx.xxx.mapper")注解 @Mapper 标注类,用在持久层的接口上,注解使用后相当于@Reponsitory加@MapperScan注解,会自动进行配置加载

  • js+jquery常用知识点汇总

    一.jquery源码中常见的知识点 1.string,number类型转换的快捷方法 复制代码 代码如下: // @param s为字符串,n为数字 function fn(obj){     //转换为String类型     var s = obj +"";     //转换为number类型     var n = +obj; } 分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 &

  • Python常用知识点汇总

    1.Set基本数据类型 a.set集合,是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. """ def add(self, *args, **kwargs): # real signat

  • 关于ES6新特性最常用的知识点汇总

    目录 1.关键字 2.解构 3.字符串 4.正则 5.数组 6.函数 7.对象 8.Symbol 9.集合 10.Proxy配合Reflect的观察者模式 11. Promise 12.遍历器 13.Generator 14.async 15.Class 16.修饰器 17.Moudle 总结 1.关键字 Let 关键字 在let所在的代码块中起作用.在let之前对于改该变量是不能进行赋值的 Const关键字  为只读变量,因此在定义的时候就需要去赋值. 2.解构 变量的解构, 1>.数组结构利

  • 常用的Java数据结构知识点汇总

    目录 1.数据结构分类 2.线性数据结构 2.1数组 2.2可变数组 2.3链表 2.4栈 2.5队列 3.非线性数据结构 3.1树 3.2图 3.3散列表 3.4堆 1. 数据结构分类 按照线性和非线性可以将Java数据结构分为两大类: ①线性数据结构:数组.链表.栈.队列②非线性数据结构:树.堆.散列表.图 2. 线性数据结构 2.1 数组 数组是一种将元素存储于连续内存空间的数据结构,并且要求元素的类型相同. // 定义一个数组长度为5的数组array int[] array = new

  • CodeIgniter常用知识点小结

    本文简单总结了CodeIgniter开发中的常用知识点.分享给大家供大家参考,具体如下: 跳转: $this->load->helper('url'); redirect(); 常量定义: config/constants.php 关于语言文件: 只说我自己的做法 为了统一管理错误信息 决定做一个error_lang.php 在application/language下新建文件夹chinese 新建文件 error_lang.php 在config.php里: $config['languag

随机推荐