Skip to content

路由

路由概述

基于ThinkPHP框架的路由系统实现,采用灵活的路由定义方式,支持域名路由、规则路由、分组路由、中间件应用等特性。系统将不同类型的路由进行分类管理,实现了清晰的权限控制和业务分离。

路由目录结构

路由文件分布在以下几个主要位置:

plaintext
niucloud/
├── route/
│   └── app.php                     #主路由文件,定义基础路由规则
├── app/
│   ├── adminapi/route/             #管理后台API路由
│   │   ├── route.php               #管理后台基础路由
│   │   └── addon.php               #管理后台插件相关路由
│   ├── api/route/                  #前端API路由
│   │   └── route.php               #前端API路由定义
├── config/
│   └── route.php                   #路由配置文件
└── addon/                          #插件目录,包含各插件的路由

主路由文件(route/app.php)

主路由文件定义了系统的基础路由规则,包括域名映射、页面跳转和插件路由加载等功能。

域名路由

系统使用Route::domain方法配置域名路由,将特定域名映射到对应控制器命名空间:

php
// 将install.php域名映射到app\install\controller命名空间
Route::domain('install.php', ':\app\install\controller');

页面跳转路由

系统定义了多个页面跳转路由,用于前端页面访问:

php
// 访问首页自动跳转到admin或wap
Route::rule('/', function () {
    if (Request::isMobile()) {
        return redirect('/wap');
    } else {
        return redirect('/admin');
    }
});

// 管理后台页面路由
Route::rule('admin', function () {
    return view(app()->getRootPath() . 'public/admin/index.html');
})->pattern(['any' => '\\w+']);

// 其他页面路由(site、home、decorate、wap、web等)
// ...

插件路由加载

主路由文件负责动态加载所有插件的路由配置:

php
// 加载插件的route
$addon_dir = root_path() . 'addon';
$addons = array_diff(scandir($addon_dir), ['.', '..']);
foreach ($addons as $addon) {
    $route = $addon_dir . DIRECTORY_SEPARATOR . $addon . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'route.php';
    if (file_exists($route)) {
        include $route;
    }
}

路由配置文件(config/route.php)

路由配置文件定义了系统路由的基础参数设置:

php
return [
    // pathinfo分隔符
    'pathinfo_depr'         => '/',
    // URL伪静态后缀
    'url_html_suffix'       => 'html',
    // URL普通方式参数 用于自动生成
    'url_common_param'      => true,
    // 是否开启路由延迟解析
    'url_lazy_route'        => false,
    // 是否强制使用路由
    'url_route_must'        => false,
    // 路由是否完全匹配
    'route_complete_match'  => false,
    // 访问控制器层名称
    'controller_layer'      => 'controller',
    // 空控制器名
    'empty_controller'      => 'Error',
    // 默认控制器名
    'default_controller'    => 'Index',
    // 默认操作名
    'default_action'        => 'index',
    // 其他配置...
];

业务路由实现

API路由(app/api/route/route.php)

API路由定义了前端接口的访问规则,支持多种请求方式和中间件应用:

php
// 引入中间件
use app\api\middleware\ApiChannel;
use app\api\middleware\ApiCheckToken;
use app\api\middleware\ApiLog;

// 公众号消息推送路由,应用多个中间件
Route::any('wechat/serve/:site_id', 'wechat.Serve/serve')
    ->middleware(ApiChannel::class)
    ->middleware(ApiCheckToken::class)
    ->middleware(ApiLog::class);

// 分组路由定义
Route::group(function () {
    //登录接口
    Route::get('login', 'login.Login/login');
    //注册接口
    Route::post('register', 'login.Register/account');
    Route::post('register/mobile', 'login.Register/mobile');
    //会员相关接口
    //地区管理接口
    //其他业务接口...
});

// 加载插件路由
( new DictLoader("Route") )->load([ 'app_type' => 'api' ]);

管理后台路由(app/adminapi/route/route.php)

管理后台路由定义了管理端接口的访问规则:

php
// 基础登录相关路由
Route::group(function() {
    //用户登录
    Route::get('login/:app_type', 'login.Login/login');
    //登录注册设置
    Route::get('login/config', 'login.Config/getConfig');
    //生成验证码
    Route::get('captcha/create', 'login.Captcha/create');
    //一次校验验证码
    Route::get('captcha/check', 'login.Captcha/check');
});

//加载插件路由
( new DictLoader("Route") )->load([ 'app_type' => 'adminapi' ]);

插件管理路由(app/adminapi/route/addon.php)

插件管理路由定义了插件管理相关的接口规则,应用了管理后台中间件:

php
use app\adminapi\middleware\AdminCheckRole;
use app\adminapi\middleware\AdminCheckToken;
use app\adminapi\middleware\AdminLog;

// 应用插件相关路由
Route::group(function () {
    //获取本地插件
    Route::get('addon/init', 'addon.Addon/init');
    Route::get('addon/local', 'addon.Addon/getLocalAddonList');
    //获取插件列表
    Route::get('addon', 'addon.Addon/lists');
    //获取插件详情
    Route::get('addon/:id', 'addon.Addon/info');
    //安装插件
    Route::post('addon/install/:addon', 'addon.Addon/install');
    //其他插件管理接口...
})->middleware(AdminCheckToken::class)
  ->middleware(AdminCheckRole::class)
  ->middleware(AdminLog::class);

基于 MIT 协议发布