# Bundle

Laravel（Lumen）官方建议将所有代码都放到 app 目录下面：

> * app 目录包含应用程序的核心代码。你应用中几乎所有的类都应该放在这里。
> * app 目录包含额外的各种目录，比如：Console, Http, 和 Providers

按照官方的建议将所有的应用程序代码都放到 app 目录里面，随着项目的增大，代码增多，需求逐渐复杂，后期将会导致代码过于复杂，维护成本急剧增高。

借鉴商派 ECOS 框架 APP 机制和 symfony 的 Bundle 系统，我们在 ecshopx 中也实现了一种模块化的机制，我们也称为 Bundle。

一个 Bundle 就是一个模块，其包含模块所有的资源。所有的 Bundle 都位于 `src` 目录下， Bundle 的命名规则为`业务名称+Bundle`， 它的目录结构如下：

| 文件/目录            | 描述                                                   |
| ---------------- | ---------------------------------------------------- |
| **Entities**     | 包含本 Bundle 的所有实体类，一个实体类对应一张数据表。可以通过修改实体类来维护表结构       |
| **Events**       | 包含事件类                                                |
| **Http**         | 包含控制器，按照Api、FrontApi、ShopApi等分组，每个控制器都有所属版本号         |
| **Interfaces**   | 包含本 Bundle 所有接口抽象                                    |
| **Jobs**         | 包含队列任务类                                              |
| **Listeners**    | 目录包含事件的处理类                                           |
| **Providers**    | 包含本 Bundle 的服务提供者                                    |
| **Repositories** | 处理数据库逻辑，一般和entity表文件一对一。                             |
| **Services**     | 所有业务处理的逻辑放在此目录，供控制器调用                                |
| **Traits**       | 本 Bundle 可被复用的逻辑可以抽象为trait放在此目录                      |
| **README.md**    | 本 Bundle 的说明文件，介绍该 Bundle 的基本功能，主要类和一些设计思想，供其他开发人员参阅 |
