Laravel项目中Models、Controllers与Routes的常见组织方式咨询
Laravel大型应用开发实践与项目结构建议
一、目录结构优化
- 核心业务拆分:在默认
app/目录下,将通用逻辑与业务逻辑分离,新增Domains/目录存放各业务领域代码(如用户、订单、商品),每个领域下细分Models、Services、Actions、Policies等;Support/目录存放通用工具类、辅助函数、枚举类等。
示例结构:app/ ├── Domains/ │ ├── User/ │ │ ├── Models/ │ │ │ └── User.php │ │ ├── Services/ │ │ │ └── UserService.php │ │ ├── Actions/ │ │ │ └── CreateUserAction.php │ │ └── Policies/ │ │ └── UserPolicy.php │ └── Order/ │ ├── Models/ │ │ ├── Order.php │ │ └── OrderItem.php │ └── Services/ │ └── OrderService.php ├── Support/ │ ├── Enums/ │ │ └── OrderStatus.php │ ├── Helpers/ │ │ └── FormatHelper.php │ └── Traits/ │ └── HasUuid.php ├── Http/ │ ├── Controllers/ │ │ ├── UserController.php │ │ └── OrderController.php │ └── Requests/ │ ├── StoreUserRequest.php │ └── UpdateOrderRequest.php └── Models/ └── BaseModel.php - 资源与配置分离:业务规则类配置放到
config/下对应业务文件,比如config/order.php存放订单超时时间、退款规则等;视图文件按业务模块拆分,如resources/views/user/、resources/views/order/。
二、分层架构实践
- 控制器仅做路由转发:控制器只负责接收请求、调用业务逻辑、返回响应,不编写复杂业务代码。示例:
// app/Http/Controllers/OrderController.php public function store(StoreOrderRequest $request) { $order = app(CreateOrderAction::class)->execute($request->validated()); return response()->json($order, 201); } - 用Actions封装单一业务操作:每个Action只处理一件事,比如
CreateOrderAction负责订单创建全流程(校验库存、生成订单号、扣减库存、创建记录),提升代码复用性与可测试性。 - Services处理领域内复杂逻辑:将同一领域的关联操作集中到Service,但避免做成“万能类”,保持单一职责。比如
UserService可封装登录、注册、密码重置等相关操作。 - Models专注ORM逻辑:模型只处理数据库相关操作,如关联关系、查询作用域、访问器/修改器,不掺杂业务逻辑。示例:
// app/Domains/User/Models/User.php public function scopeActive($query) { return $query->where('status', UserStatus::Active); } public function orders() { return $this->hasMany(Order::class); }
三、模块化开发(可选但推荐)
针对超大型项目,可采用Laravel包开发模式,将每个业务模块做成独立包,比如packages/user/、packages/order/,每个包拥有独立的Models、Controllers、Routes、Views,实现模块解耦,便于维护与复用。示例包结构:
packages/ └── User/ ├── src/ │ ├── UserServiceProvider.php │ ├── Domains/ │ │ └── User/... │ ├── Http/ │ │ ├── Controllers/... │ │ └── Requests/... │ └── routes/ │ └── api.php └── composer.json
在项目composer.json中引入本地包,通过ServiceProvider完成模块注册。
四、通用开发实践
- 严格使用表单请求验证:所有用户输入通过
FormRequest类验证,不在控制器内编写验证逻辑,保持代码整洁。 - 用枚举类管理状态值:订单状态、用户状态等用PHP枚举类定义,避免硬编码数字或字符串,提升可读性与可维护性。示例:
// app/Support/Enums/OrderStatus.php enum OrderStatus: int { case Pending = 1; case Paid = 2; case Shipped = 3; case Completed = 4; case Cancelled = 5; } - 日志与监控:为不同业务模块设置独立日志通道(如在
config/logging.php中新增order通道),便于问题排查;使用Laravel Horizon监控队列,或第三方工具监控应用性能与错误。 - 分层测试:编写单元测试(测试Models、Actions、Services)、功能测试(测试控制器与路由)、集成测试(测试模块交互),保障代码质量。
内容的提问来源于stack exchange,提问作者Kayopaba
相关产品推荐
相关产品推荐

