ThinkPHP6的中间件讲解及路由配置
TP框架,在开发中用到了中间件、注入和依赖、门面模式等。今日就说说中间件,这也不是啥多么新鲜和高级的东西,在很多框架中都有类似实现的方式,像YII的行为和拦截器什么的,也都是差不多的作用。更多的是将业务和一些逻辑做了解耦分离,使整个业务更清楚,不会在一个地方写一大堆代码。
比如要控制写日志、权限认证、来源判断、白名单、返回Json等你都可以写在不同的中间件里面,避免了将这些代码写到一个地方去判断,也可以重复利用代码,所以说,适当用上中间件来写,还是挺爽的。
在TP6中,有好几种不同类型的中间件,像全局中间件、应用中间件、路由中间件、控制器中间件,它们之间的执行顺序也是按上面的来的。
全局中间件
在app/middleware.php定义的中间件
return [ // Session初始化 \think\middleware\SessionInit::class ];
应用中间件
这个是在应用下面定义的,如我的app目录下面有 api,admin应用,那么在app/api/middleware.php定义:
return [ \app\api\middleware\Log::class ];
路由中间件
就是在注册路由时,可以注册中间件,执行这个路由时,执行相对应的中间件。
Route::post('create-order','app\\api\\controller\\order\OrderPay@createOrder')->middleware(app\\middleware\Auth::class);
控制器中间件
在控制器中定义$middleware属性,如下示例,当访问index控制时,就会执行中间件
class Index extends BaseController { protected $middleware = [\app\admin\middleware\CheckAdmin::class]; public function index() { echo 'test'; } }
路由
路由可以灵活控制网站的URL地址显示,不过是隐藏真实地址,美化地址都能轻易实现,比如某个项目,因为要兼容以前的地址,到时候迁移的时候只想要改域名就行了,所以需要把路径搞成一样的。
以前的项目是用.NET写的,里面的URL有v1,v2这种,这种东西在.NET中很简单,就配置一个注解就行了。这个在TP中也是很容易实现的。通过配置路由就行了。
配置路由
一 、TP的路由文件可以配置在/route/[应用]/app.php或 app/[应用]/app.php等,如果在应用中配置了,那么 /route下面就不会执行了。
在 /route/api/app.php配置路由定义
use think\facade\Route; Route::group('hpay',function(){ Route::post('create-order','app\\api\\controller\\order\OrderPay@createOrder'); Route::post('query-order','app\\api\\controller\\order\OrderQuery@queryOrder'); });
二、在 config/app.php里面加一个应用映射
'app_map' => [ Env::get('htpay.version', 'v1') => 'api', //映射,就是把路径v1这种导到api应用中。 ],
上面两步就可以实现了,这样你访问 http://域名/v1/hpay/create-order v1就映射到api应用,hpay/create-order就能访问到配置的控制器中了,完美实现,代码不需要更改任何东西。
不过这里要注意下,上面配置的是 Route::post,所以只能通过post的方式来访问,用其它方式访问就会访问不到了,这样更好,本来想用中间件来限制只能 post访问,结果根本都不需要了。
- Layui的upload模块实现多图批量上传,无需修改代码,完美解决方案
- 推荐:腾讯开源的Markdown编辑器,轻量简洁、易扩展,开箱即用
- JS中三个点(...)是什么意思?其实它的真名叫“扩展运算符”
- 编程界首部小说版教程—JavaScript百炼成仙
- 微软推出 VS Code for the Web 无需在 PC 上进行安装 打开浏览器就可以开始工作
- Vue 3.2 刚刚发布!新的单文件组件,响应式性能大幅提升
- 焕然一新 新版 Vue3中文文档上线
- javascript的遍历方法forEach和map的区别
- js去除字符串首尾空格的十二种方案
- div设置为height:100%不起作用,无法占满整个屏幕的解决办法