路由
最新修改于 2024-08-27 17:50
# 路由
使用thinkphp,建议开启强制路由;
不开启强制路由的程序猿不是个好好程序猿(可以有效防止黑客恶意访问,如:猜后台地址,猜文件路径)
开启强制路由:文件位置:config/route.php
‘url\_route\_must’ => true, // 是否强制使用路由
### 认识系统路由
当前主要针对CRMEB客户关系管理系统为例指导大家如何配置路由。对路由的基本知识点,我们在不做过多赘述,不太懂的小伙伴可以前往
[Thinkphp开发文档](https://www.kancloud.cn/manual/thinkphp6_0/1037494)进行学习。
接口地址:[http://域名/应用模块目录名/具体业务控制器目录/方法名](http://域名/应用模块目录名/具体业务控制器目录/方法名)
controller目下下的业务类文件和route路由下的路由文件基本是一一对应的。大家也会发现个别业务控制器没有对应的路由文件,这个需要说明一点,业务控制器并不是强制一一对应的,当然你完全可以把order控制器中的接口地址配置到user路由文件里面,但是为了各模块功能清晰,保证统一管理,不建议你这么做。
### 如何新增路由
我们以order控制器为例,新增order_demo方法。控制器目录:admin/controller/store/order/StoreOrder.php
public function order_demo() { $where = $this->request->postMore([ ['one', '2'], ['two', '2'], ]); $data = $this->services->orderCount($where); return $this->success($data); }
配置路由,路由目录:/route/admin.php
Route::post('demo', 'admin.store.order.StoreOrder/order_demo')->name('OrderDemo');
### 如何修改路由请求方式
我们以order控制器为例,请求访问chart方法。`Route::get('chart', 'admin.store.order.StoreOrder/chart')->name('StoreOrderChart')`,是我们当前接口的路由配置,前端以get请求调取接口即可:[http://serverName/adminapi/order/chart。](http://serverName/adminapi/order/chart。)
如果我们要修改请求方式,将get修改为post,记得修改四处地方:
1. 将接口数据接收方式改为post接收
public function chart(){ $where = $this->request->postMore([ ['data', '', '', 'time'], [['type', 'd'], 0], ]); $data = $this->services->orderCount($where); return $this->success($data);}
1. 路由文件配置改为post请求。
Route::post('chart', 'admin.store.order.StoreOrder/chart')->name('StoreOrderChart');
2. 前端调用请求方式务必改为post请求
3. 后台菜单【设置】【管理权限】【权限规则】进入数据列表,将订单->订单管理->订单数据请求方式改为post即可,
### 如何给路由添加混合参数
路由配置:在方法名后/:参数
Route::get('chart/:id', 'admin.store.order.StoreOrder/chart')->name('StoreOrderChart');
控制器:入参传入\$id
public function chart($id) { $where = $this->request->getMore([ ['data', '', '', 'time'], [['type', 'd'], 0], ]); $where['orderId'] = $id; $data = $this->services->orderCount($where); return $this->success($data); }
### 资源路由
支持设置 `RESTFul`请求的资源路由,方式如下:
`Route::resoure('user','user');`
表示注册了一个名称为 `user`的资源路由到 `User`控制器,系统会自动注册7个路由规则,如下:
| 标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
| —- | —- | —- | —- |
| index | GET | user | index |
| create| GET | user/create | create |
| save | POST | user | save |
| read | GET | user/:id | read |
| edit | GET | user/:id/edit | edit |
| update | PUT | user/:id | update |
| delete | DELETE | user/:id | delete |
### 路由分组
> 使用 `Route`类的 `group`方法进行注册,路由分组也支持嵌套,例如:
>
> //分组嵌套Route::group('user',function(){ Route::get('user_info','user/user/info'); Route::get('group','user.gourp/list'); Route::get('label','user.label/list');});//嵌套Route::group('user',function(){ Route::get('user_info','user/user/info'); Roure::group('group',function(){ Route::get('group','user.gourp/list'); }); Route::group('label',function(){ Route::get('label','user/label/list'); });});
>
> ### 路由分组与路由中间件配合使用,可以控制访问权限
>
> Route::group('user',function(){ Route::get('user/[:type]','user/list');})->middleware(\app\index\middleware\AuthTokenMiddleware::class, true);
>
> ### 跨域请求
>
> 如果某个路由或者分组需要支持跨域请求,可以使用
>
> Route::get('user/[:type]','user/list')->allowCrossDomain();
>
> 跨域请求一般会发送一条 `OPTIONS`的请求,一旦设置了跨域请求的话,不需要自己定义 `OPTIONS`请求的路由,系统会自动加上。
> 会默认带上header:
>
> Access-Control-Allow-Origin:\* Access-Control-Allow-Methods:GET, POST, PATCH, PUT, DELETE Access-Control-Allow-Headers:Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With
>
> 也可以添加或更改header
>
> Route::get('user/[:type]','user/list')->allowCrossDomain([ 'Access-Control-Allow-Origin' => 'thinkphp.cn', 'Access-Control-Allow-Credentials' => 'true' ]);
>
> ### MISS路由
>
> 如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以注册一个单独的 `MISS`路由:
>
> Route::miss('public/index');
>
> 也可以使用闭包
>
> Route::miss(function(){ return '404 Not Found!';});