## 项目结构

### `arch` 目录

`arch` 将业务代码与框架代码分离，主要实现一下几点功能：

- 启动服务加载
- 逻辑分层基类
- 统一输出处理
- 统一错误处理
- 自动缓存处理
- 标准查询能力
- 代码生成器
- 数据库能力扩展
- Request能力扩展
- HTTP请求/数据库查询 Debug
- 一些辅助函数

### `app` 目录

`app` 内存放业务逻辑代码，有以下几个目录:

#### [ `Console` 目录]

命令行程序的核心引导文件；

#### [ `Core` 目录]

一些核心的基类放在这儿，供其他类继承调用；

#### [ `Events` 目录]

公用事件，事件应当是公用的，而监听是各自的；

### [ `Exceptions` 目录]

错误类的定义，如有需要自定义错误码等，请在该目录定义；

### [ `Models` 目录]

模型层的定义，业务应围绕数据进行展开，数据是公用的，而Repository仓库是各自的；

### [ `Domains` 目录]

以功能点为领域进行开发，这是本项目结构的核心部分；旨在进行低耦合的开发，明确各个功能细分；

`Domains` 文件结构:

```
Domains 1
    ├── Console
    │── Database
    │    └── migrations
    │── Http
    │    ├── Controllers
    │    ├── Middleware
    │    └── Requests
    ├── Providers
    ├── Repositories
    ├── Routes
    ├── Services
    └── Tests
        └── Services

Domains 2
    ├── Console
    │── Database
    │    └── migrations
    │── Http
    │    ├── Controllers
    │    ├── Middleware
    │    └── Requests
    ├── Providers
    ├── Repositories
    ├── Routes
    ├── Services
    └── Tests
        └── Services
```

> 生成命令: `php dipper make:domain {Name}`

#### 请求生命周期:

Route -> Request -> Controller -> Service -> Repository -> Model

#### 路由 （Route）

生成的Domain中会默认含有两个路由文件 api.php 和 web.php。
api.php 会有全局的json输出处理，所有的api接口都应该放在这个目录。
web.php 适合书写页面文件的路由。

- 注意：路由的一个前缀建议为该Domain名称的 复数形式。

#### 请求（Request）

- `Request` 可以放表单验证/身份认证 规则。

- `Request` 只能在控制器里被注入使用，在注入时自动运行验证规则，如果不通过就立即抛出异常。

> 生成命令: `php dipper make:request {RequestName} [DomainName]`

#### 控制器（Controller）

- 尽量不要将业务逻辑写在Controller层，放在Service层可以得到更好的复用。

> 生成命令: `php dipper make:controller {ControllerName} [DomainName]`

#### 服务层（Service）

主要书写业务逻辑的地方，放在Service层可以得到更好的复用。如一个功能同时拥有后台和手机端等，是可以公用一个Service来查询数据的。

> 生成命令: `php dipper make:service {ServiceName} [DomainName]`

#### 仓库层（Repository）

主要书写数据库查询的地方，一些复杂的查询应该写这里，方便后期做查询索引等优化。

> 生成命令: `php dipper make:repository {RepositoryName} [DomainName]`
