竹笋

首页 » 问答 » 灌水 » ThinkPHP框架实战讲解路由解读
TUhjnbcbe - 2023/9/5 20:41:00

路由是开发过程中比较重要的一环,在ThinkPHP5.1版本后路由默认开启,并且不可以关闭,足以可见它的重要性。下面我们来具体的说一下;

注意事项

1、默认开启、不可关闭;

2、优先匹配、多模式支持;

3、匹配成功,不再继续匹配;

4、默认支持数字、字母、下划线,不支持中文及特殊符号;

PHP

主要作用

1、URL链接更加规范、美观,更加适合SEO优化;

2、隐式传入额外请求参数;

3、请求方式拦截,区分GET、POST等请求方式;

4、绑定请求数据;

5、处理请求缓存,优化程序响应时间;

6、路由中间件支持(V5.1.6+版本以上支持);

SEO优化

路由定义

1、定义位置:route/route.php文件内,可以在route目录内多文件定义,最终框架会进行路由整合,建议采用域名+分组模式定义路由。

2、定义方式:

Route::get(new/:id,News/read);//定义GET请求路由规则Route::post(new/:id,News/update);//定义POST请求路由规则Route::put(new/:id,News/update);//定义PUT请求路由规则Route::delete(new/:id,News/delete);//定义DELETE请求路由规则Route::any(new/:id,News/read);//所有请求都支持的路由规则

请注意:

1、路由匹配成功后,原链接访问方式会失效;

2、完全匹配需在尾部添加$;

3、变量可有可无使用[]包裹变量;

变量规则

系统默认的变量规则设置是\w+,只会匹配字母、数字和下划线字符,并不会匹配特殊符号和中文,需要定义变量规则或者调整默认变量规则。

1、局部配置(仅在当前路由有效)

*定义GET请求路由规则并设置name变量规则

Route::get(new/:name,News/read)-pattern([name=\w+]);

2、全局配置(全部路由有效)

*设置name变量规则(采用正则定义)

Route::pattern(name,\w+);

*支持批量添加

Route::pattern([name=\w+,id=\d+,]);

3、组合变量

*组合变量的优势是路由规则中没有固定的分隔符,可以随意组合需要的变量规则和分割符

Route::get(item-name-id,product/detail)-pattern([name=\w+,id=\d+]);

PHP框架

路由地址

闭包支持

实际开发过程中不常用,是一种简单直接的定义模式;

Route::rule(hello/:name,function(Request$request,$name){$method=$request-method();return[.$method.]Hello,.$name;});

路由参数

互联网开发

路由缓存

在定义大量的路由时,强烈建议使用路由缓存,注意仅在部署模式下有效,开启该缓存可以明显提升路由解析性能。

开启方式,在应用配置文件app.php中设置开启:

route_check_cache=true,

开启后,会自动对每次的路由请求的调度进行缓存,第二次如果是相同的请求则无需再次经过路由解析,而是直接进行请求调度。

清除命令:

phpthinkclear--route

跨域请求

如果某个路由或者分组需要支持跨域请求,可以使用如下代码:

Route::get(new/:id,News/read)-ext(html)-allowCrossDomain();

注解路由

此方式不建议使用,缺点路由分散不方便管理,同时书写规则要求较为严格。

代码

路由分组

强烈建议使用,下面书写一种比较完善的路由分组写法:

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

MISS路由

如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以注册一个单独的MISS路由,总结来说,可以应用于页面,防止程序找不到路由而报错(一旦设置了MISS路由,相当于开启了强制路由模式);

Route::miss(public/miss);

资源路由

实际开发过程中不常用,不做描述。

快捷路由

此方式要求在控制器层面定义方法名称较为严格,简单做一下描述,不建议使用。

*给User控制器设置快捷路由

Route::controller(user,index/User);?phpnamespaceapp\index\controller;classUser{publicfunctiongetInfo(){}}

代码

路由别名

路由别名不支持变量类型和路由条件判断,单纯只是为了缩短URL地址,并且在定义的时候需要注意避免和路由规则产生混淆。设置操作方法的请求类型:

*user别名路由到index/user控制器

Route::alias(user,index/user,[ext=html,allow=index,save,delete,method=[index=GET,save=POST,delete=DELETE],]);

路由绑定

把当前的URL绑定到模块/控制器/操作,最多支持绑定到操作级别,例如在路由配置文件中添加:

*绑定当前的URL到index模块

Route::bind(index);

*绑定当前的URL到index模块的blog控制器

Route::bind(index/blog);

域名路由

支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL、加快匹配的作用。

Route::domain([blog,admin],function(){Route::rule(new/:id,index/news/read);});

URL生成

支持路由URL地址的统一生成,并且支持所有的路由方式,但是不建议使用,直接在页面中手动设置,减少模板解析时间。

可以使用助手函数url,不需要继承框架基础控制器类即可使用,示例如下:

url(index/blog/read,id=5name=thinkphp);

解析后为:/index.php/blog/5/name/thinkphp.html

其他配置方式不做过多讲解。请移步官方文档查看。

1
查看完整版本: ThinkPHP框架实战讲解路由解读