项目结构介绍

本文档详细解析 Viswoole 项目的目录结构,帮助开发者理解各模块的职责与边界。

目录总览

text
viswoole/
├── app/                    # 应用层 — 业务代码存放目录
├── config/                 # 配置层 — 所有配置文件
│   └── route/              #   路由注册文件
├── framework/              # 框架层 — Viswoole 核心源码(独立 Composer 包)
│   └── src/                #   框架源码入口
├── public/                 # 公共资源 — 可公开访问的静态文件
├── runtime/                # 运行时 — 日志、缓存等动态生成文件
├── composer.json           # 项目依赖声明
├── viswoole                # CLI 入口文件
└── watch                   # 文件监控热重载脚本

应用层 (app/)

应用层是开发者编写业务代码的主要区域,遵循 PSR-4 自动加载规范(命名空间前缀为 App\)。

text
app/
├── Controller/             # 控制器目录
│   └── Example.php         #   示例控制器
├── Interface/              # 数据传输对象接口(DTO)
│   ├── UserInfo.php        #   用户信息接口
│   └── Gender.php          #   枚举/常量定义
├── Request.php             # 自定义请求对象(可选)
└── Response.php            # 自定义响应对象(可选)

Controller(控制器)

控制器负责处理 HTTP 请求并返回响应。Viswoole 支持通过 注解驱动 的方式自动注册路由:

php
<?php
declare (strict_types=1);

namespace App\Controller;

use Viswoole\Router\Annotation\{AutoController, RouteMapping};
use Viswoole\HttpServer\AutoInject\InjectGet;

#[AutoController]
class Example
{
    #[RouteMapping(method: 'GET', paths: '/hello')]
    public function hello(#[InjectGet] string $name = 'Viswoole'): string
    {
        return "Hello, {$name}!";
    }
}

Interface(数据传输对象)

Interface 目录用于定义数据传输对象的接口或枚举,可与参数注入配合使用,实现请求体的自动反序列化与校验:

php
<?php
declare (strict_types=1);

namespace App\Interface;

enum Gender
{
    case MAN;
    case WOMAN;
}

class UserInfo
{
    public string $name;
    public Gender $gender;
}

配置层 (config/)

配置层集中管理所有应用和框架的配置项,采用 PHP 返回数组的方式组织:

text
config/
├── app.php                 # 应用基础配置(时区、调试模式、服务注册)
├── server.php              # Swoole 服务配置(端口、进程数、协程设置)
├── router.php              # 路由全局配置
├── database.php            # 数据库连接配置
├── cache.php               # 缓存驱动配置
├── log.php                 # 日志系统配置
├── listens.php             # 事件监听配置
├── lazy/                   # 延迟加载配置
│   └── middleware.php      #   中间件延迟加载
└── route/
    └── route.php           # 路由注册文件

关键配置说明

server.php — 服务配置

定义 Swoole Server 的核心参数,包括监听地址、端口、进程数、协程设置等:

php
return [
    'default_start_server' => env('default_start_server', 'http'),
    'servers' => [
        'http' => [
            'type' => \Swoole\Http\Server::class,
            'construct' => [
                'host' => '0.0.0.0',
                'port' => 9501,
                // ... 更多构造参数
            ],
            'options' => [
                // 上传文件大小限制、HTTP2 支持等
            ],
            'events' => [
                // 事件回调绑定
            ]
        ]
    ],
    // 全局选项(worker 数量、最大协程数、日志级别等)
    'options' => [...],
];

app.php — 应用配置

管理应用级的基础设置,包括时区、调试模式、服务提供者和自定义命令的注册:

php
return [
    'default_timezone' => env('default_timezone', 'Asia/Shanghai'),
    'debug' => env('app_debug', true),
    'services' => [
        \Viswoole\Core\Service\TaskService::class,  // 异步任务服务
    ],
    'commands' => []  // 自定义命令注册
];

route/route.php — 路由注册

所有路由在此文件中集中定义,支持闭包和控制器两种方式:

php
use Viswoole\HttpServer\Facade\Request;
use Viswoole\HttpServer\Facade\Response;
use Viswoole\Router\Facade\Router;

// 闭包路由
Router::get('/', function (Request $request, Response $response) {
    return $response->html('<h1>Hello Viswoole</h1>');
});

// 兜底路由(404 处理)
Router::miss(function (Request $request, Response $response) {
    return $response->status(404)->json(['code' => 404, 'msg' => 'Not Found']);
});

框架层 (framework/)

框架层是 Viswoole 的核心代码,作为独立的 Composer 包(viswoole/framework)引入项目中。一般情况下无需修改此目录下的代码

text
framework/src/
├── Core/                   # 核心模块
│   ├── Container.php       #   IOC 依赖注入容器
│   ├── App.php             #   应用引导类
│   ├── Config.php          #   配置管理器
│   ├── Event.php           #   事件调度器
│   ├── Coroutine.php       #   协程上下文管理
│   ├── Facade.php          #   门面基类
│   ├── Validate.php        #   参数校验器
│   ├── Console.php         #   控制台命令内核
│   ├── Server.php          #   服务器管理器
│   ├── Service/            #   服务提供者与中间件服务
│   ├── Facade/             #   门面实现(App、Config、Env 等)
│   ├── Middleware/         #   内置中间件(跨域等)
│   ├── Channel/            #   连接池管理
│   ├── Validate/           #   校验规则引擎
│   └── Exception/          #   异常体系
├── HttpServer/             # HTTP 服务模块
│   ├── Request.php         #   请求对象
│   ├── Response.php        #   响应对象
│   ├── HttpService.php     #   HTTP 服务启动逻辑
│   ├── AutoInject/         #   参数自动注入(GET/POST/Header/File)
│   ├── Message/            #   消息封装(UploadedFile、Uri 等)
│   ├── Contract/           #   请求/响应接口契约
│   ├── Facade/             #   门面(Request、Response)
│   └── Validate/           #   文件上传校验规则
├── Router/                 # 路由模块
│   ├── Router.php          #   路由管理器
│   ├── Annotation/         #   注解定义(AutoController、RouteMapping)
│   ├── Route/              #   路由实体(Route、Group、Miss)
│   ├── ApiDoc/             #   API 文档生成器
│   ├── Commands/           #   路由相关命令
│   └── Facade/             #   Router 门面
├── Database/               # 数据库 ORM 模块
│   ├── Model.php           #   模型基类
│   ├── BaseQuery.php       #   查询构建器基类
│   ├── DbManager.php       #   数据库连接管理器
│   ├── Collection/         #   集合封装
│   ├── Query/              #   查询组件(CRUD、Where、Join 等)
│   ├── Channel/            #   PDO 连接池
│   └── Facade/             #   DB 门面
├── Cache/                  # 缓存模块
│   ├── CacheManager.php    #   缓存管理器
│   ├── Driver/             #   缓存驱动(File、Redis)
│   ├── Contract/           #   缓存接口契约
│   └── Facade/             #   Cache 门面
└── Log/                    # 日志模块
    ├── LogManager.php      #   日志管理器
    ├── Drives/             #   日志驱动(File)
    ├── Collector.php       #   日志收集器
    └── Facade/             #   Log 门面

公共资源目录 (public/)

存放可直接通过 Web 访问的静态文件:

text
public/
├── favicon.ico             # 网站图标
└── logo.png                # Logo 图片

运行时目录 (runtime/)

存放程序运行期间动态生成的文件,不应纳入版本控制(已配置在 .gitignore 中):

text
runtime/
├── sysLog.log              # Swoole 系统日志
├── log/                    # 应用日志
└── cache/                  # 缓存文件(如使用 File 缓存驱动)

入口文件

viswoole — CLI 入口

项目的命令行入口文件,所有 php viswoole ... 命令均由此文件启动:

php
#!/usr/bin/env php
<?php
declare (strict_types=1);

use Viswoole\Core\App;

ini_set('display_errors', 'on');
ini_set('memory_limit', '1G');

!defined('BASE_PATH') && define('BASE_PATH', __DIR__);
require __DIR__ . '/vendor/autoload.php';

(function () {
    App::factory()->console->run();
})();

watch — 文件监控脚本

基于 Shell 的文件变化监控脚本,用于开发阶段的热重载。通过 find 命令轮询检测 .php.env 文件的变更,配合防抖机制自动重启 Swoole 服务。

注意事项

  1. 不要修改 framework/ 目录:框架核心代码通过 Composer 管理,直接修改会导致更新时丢失更改。如需定制功能,应通过服务提供者、中间件或事件机制进行扩展。
  2. runtime/ 目录权限:确保运行 Viswoole 的用户对 runtime/ 目录有读写权限,否则日志和缓存写入会失败。
  3. 环境隔离:使用 .env 文件区分不同环境的配置,切勿将敏感信息硬编码到 config/ 中的 PHP 文件里。
  4. 命名空间规范app/ 目录下的代码统一使用 App\ 命名空间前缀,已在 composer.json 中配置 PSR-4 映射。