You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:47:27