路由

路由

使用thinkphp,建议开启强制路由;

不开启强制路由的程序猿不是个好好程序猿(可以有效防止黑客恶意访问,如:猜后台地址,猜文件路径)

开启强制路由:
文件位置:config/route.php
‘url_route_must’ => true, // 是否强制使用路由

认识系统路由

以adminapi模块举例,下面是adminapi模块目录

下图是controller目录文件和route目录文件截图

接口地址:http://域名/应用模块目录名/具体业务控制器目录/方法名

通过上图大家很明显可以看出来controller目下下的业务类文件和route路由下的路由文件基本是一一对应的。
大家也会发现个别业务控制器没有对应的路由文件,这个需要说明一点,业务控制器并不是强制一一对应的,
当然你完全可以把order控制器中的接口地址配置到user路由文件里面,但是为了各模块功能清晰,保证统一管理,不建议你这么做。

如何新增路由

我们以order控制器为例,新增order_demo方法。控制器目录:adminapi/controller/v1/order/StoreOrder.php
 public function order_demo()
    {
        $where = $this->request->postMore([
            ['one', '2'],
            ['two', '2'],
        ]);
        $data = $this->services->orderCount($where);
        return $this->success($data);
    }
配置路由,路由目录:adminapi/route/order.php
 Route::post('demo', 'v1.order.StoreOrder/order_demo')->name('OrderDemo');

如何修改路由请求方式

我们以order控制器为例,请求访问chart方法。adminapi/controller/v1/order/StoreOrder.php 如图1.3

输入图片说明
<center>图1.3</center>
下面我们再看下它对应的路由配置,adminapi/route/order.php 如图1.4
输入图片说明
<center>图1.4</center>
如上图1.4,Route::get(‘chart’, ‘v1.order.StoreOrder/chart’)->name(‘StoreOrderChart’),是我们当前接口的路由配置,前端以get请求调取接口即可: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);
    }
2. 路由文件配置改为post请求。
 Route::post('chart', 'v1.order.StoreOrder/chart')->name('StoreOrderChart');
3. 前端调用请求方式务必改为post请求
4. 后台菜单【设置】【管理权限】【权限规则】进入数据列表,将订单->订单管理->订单数据请求方式改为post即可,

如何给路由添加混合参数

路由配置:在方法名后/:参数

 Route::get('chart/:id', 'v1.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!';
});