按业务领域组织代码可提升laravel项目可维护性。1. 在app/下按模块划分目录,如Orders、Users,集中管理对应模型、控制器、请求类等。2. 分离业务逻辑,使用Action处理单一操作(如CreateOrderAction),Service协调复杂流程(如CheckoutService)。3. 使用DTO规范数据传递,提高类型安全。4. 路由按模块分组,请求类放入模块内http/Requests目录。5. 用API Resource统一响应格式。6. 测试目录结构与应用一致,Feature和Unit测试对应功能与类。7. 配置、事件、中间件等按需组织,避免过度使用Trait。小项目可用默认结构,中大型项目推荐领域驱动设计,逐步演进代码结构。
Laravel 自带清晰的目录结构,适合中小型项目快速开发。但随着业务增长,若不及时调整代码组织方式,容易导致控制器臃肿、模型承担过多逻辑、代码复用困难等问题。合理的代码结构能提升可维护性、团队协作效率和测试便利性。以下是经过实践验证的 Laravel 项目代码结构最佳组织方式。
按功能模块划分目录(Domain-Driven Design 思路)
默认的 App 目录按技术职责划分(如 Models、Http、console),但在复杂项目中建议转向按业务领域组织代码。
在 app/ 下创建业务模块目录,例如:
- app/Orders — 订单相关逻辑
- app/Users — 用户管理
- app/Payments — 支付处理
每个模块内包含该领域所需的类:
Orders/
├── Actions/
├── DataTransferObjects/
├── Events/
├── Exceptions/
├── Http/Controllers/
├── Http/Requests/
├── Models/Order.php
├── Observers/OrderObserver.php
├── Policies/OrderPolicy.php
├── Services/
└── Traits/
这种方式让所有与订单相关的代码集中管理,便于查找和维护。
分离业务逻辑:使用 Action 和 Service 类
- Action 类:处理单一职责的操作,如“创建订单”、“发送通知”。命名建议以动词结尾,如
CreateOrderAction
。 - Service 类:协调多个 Action 或外部服务,用于复杂流程,如“完成下单流程”。
示例:
app/Orders/Actions/CreateOrderAction.php
app/Orders/Services/CheckoutService.php
调用时在控制器中注入服务或直接执行 Action,保持控制器轻量。
使用数据传输对象(DTO)规范输入输出
当请求参数较多或需跨层传递数据时,使用 DTO 可提高类型安全和可读性。
安装 spatie/data-transfer-object
包,定义结构化数据类:
app/Orders/DataTransferObjects/OrderData.php
DTO 可用于表单请求、Action 输入、API 响应等场景,减少数组传递带来的错误。
合理组织 HTTP 层
路由建议使用模块分组,通过 RouteServiceProvider 加载模块下的路由文件。
- 在
routes/orders.php
定义订单相关路由 - 在
RouteServiceProvider
中引入并加前缀(如 /api/orders)
请求类(FormRequest)放在对应模块的 Http/Requests
目录下,便于权限和验证规则统一管理。
资源类与响应格式标准化
使用 Laravel 的 API Resource 统一输出格式。
为每个模型创建对应的 Resource 类:
app/Orders/Resources/OrderResource.php
app/Orders/Resources/OrderCollection.php
在控制器中返回 new OrderResource($order)
,确保前后端数据结构一致。
测试目录同步结构
测试目录也应反映应用结构。在 tests/Feature/
下建立对应模块目录:
tests/Feature/Orders/CreateOrderTest.php
tests/Feature/Orders/CheckoutTest.php
单元测试可放在 Unit/
目录下测试 Action、Service 等类。
其他优化建议
- 配置文件:自定义配置放在
config/
下独立文件,如config/payments.php
- 事件与监听器:按模块组织,或在
spatie/data-transfer-object
0 下分目录 - 中间件:通用中间件放全局,特定逻辑可放在模块的
spatie/data-transfer-object
1 - Trait 和 Helper:尽量少用 Trait,优先考虑组合;Helper 函数放在
spatie/data-transfer-object
2 并在spatie/data-transfer-object
3 中自动加载
基本上就这些。关键不是完全照搬结构,而是根据项目规模逐步演进。小项目可保持默认结构,中大型项目推荐按领域驱动方式组织。清晰的命名和一致的模式比复杂的架构更重要。
以上就是laravel项目代码结构的最佳组织方式_Laravel项目代码结构最佳实践指南的详细内容,更多请关注php中文网其它相关文章!