路由是开发过程中比较重要的一环,在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
其他配置方式不做过多讲解。请移步官方文档查看。