按模块划分app目录,使用Service与Repository分离业务和数据逻辑,控制器保持简洁并依赖注入服务类,合理组织资源、配置与自定义命令,确保测试结构清晰,提升项目可维护性与团队协作效率。

Laravel 默认的项目结构已经非常合理,但随着项目规模增长,遵循一些最佳实践能让代码更清晰、可维护性更强。以下是 Laravel 项目结构的最佳实践指南,帮助你构建易于扩展和团队协作的应用。
1. 合理组织 App 目录下的命名空间
Laravel 的 app 目录是核心逻辑存放地。默认结构适合小型项目,但在中大型项目中建议按功能模块划分:
-
创建模块目录:如
app/Modules/User、app/Modules/Order,每个模块包含自己的 Model、Service、Repository、Request 等。 -
使用命名空间:确保每个类都有清晰的命名空间,例如
App\Modules\User\Services\UserService。 - 避免控制器过于臃肿:将业务逻辑移出控制器,交给 Service 或 Action 类处理。
2. 使用 Service 和 Repository 模式分离职责
直接在控制器中写数据库查询会降低可测试性和复用性。推荐做法:
- Repository 负责数据访问:封装 Eloquent 查询,提供统一接口给上层调用。
- Service 处理业务逻辑:协调多个 Repository 或外部服务,实现具体业务流程。
-
示例结构:
app/Repositories/UserRepository.phpapp/Services/UserService.php
3. 控制器保持简洁
控制器只应负责接收请求、调用服务、返回响应。不要在这里写复杂逻辑。
- 使用 Form Request 验证输入:
php artisan make:request StoreUserRequest。 - 依赖注入 Service 类,而非直接操作模型。
- 返回统一格式的 JSON 响应(尤其 API 项目)。
4. 自定义目录结构提升可读性
对于复杂项目,可以在 app 下创建以下目录:
- Actions:存放单动作类(如 SendWelcomeEmailAction)。
- DataTransferObjects:用于传输数据的对象,替代数组传递。
- Exceptions:自定义业务异常。
- Observers:模型观察者集中管理。
- Policies 和 Gates:权限逻辑清晰分离。
5. 资源文件分类管理
resources 目录也需良好组织:
- 视图按模块划分:
resources/views/users/index.blade.php。 - JavaScript/CSS 使用模块化结构,配合 Vite 进行打包。
- Lang 文件按功能分组:
lang/en/user.php。
6. 配置与环境分离
利用 Laravel 的环境机制:
- 敏感信息放入
.env,不提交到版本控制。 - 不同环境使用不同的配置文件(如
config/services.php区分生产/测试第三方密钥)。
7. Artisan 命令与任务调度组织
自定义命令放入特定目录:
- 创建
app/Console/Commands并注册到AppServiceProvider或使用自动发现。 - 在
app/Console/Kernel.php中清晰定义计划任务。
8. 测试结构清晰
测试目录 tests 应反映应用结构:
- Feature 测试对应模块,如
Feature/User/CreateUserTest.php。 - Unit 测试针对 Service、Repository 等独立类。
- 使用 Pest 或 PHPUnit,并编写可读性强的断言。
基本上就这些。Laravel 的灵活性允许你根据项目需要调整结构,关键是保持一致性、职责分明、易于理解。良好的结构让新成员快速上手,也让后期维护成本更低。










