VuePressVuePress
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
  • 基础知识

    • 表单验证
    • 限流1
  • 请求

    • request
  • 认证

    • auth
  • 验证

    • fail
  • migrations

    • migration
  • eloquent

    • eloquent
    • updateOrCreate
  • seeder

    • seeder
    • seeder2
  • 套件

    • precognition
  • 进阶

    • Cache 缓存
  • 最佳实践

    • CRUD 最佳实践
    • 将用户定位到他的前缀域名
    • 服务类仓储类查询类
      • 逻辑关系:
    • 接口和实现
    • laravel 中 trait 引导机制
    • 使用阿里云oss上传图片
  • plugins

    • IDE Helper Generator for Laravel

服务类 仓库类 查询类 这些类之间的逻辑关系

服务类、仓库类和查询类之间的逻辑关系是一种分层架构,每一层都有其特定的职责。让我为您详细解释它们之间的关系:

  1. 仓库类 (Repository):
    • 主要职责是处理数据持久化逻辑。
    • 直接与数据库或其他数据存储交互。
    • 提供基本的CRUD(创建、读取、更新、删除)操作。
    • 封装复杂的数据库查询。
    • 示例: CompanyRepository
  2. 查询类 (Query):
    • 专注于构建复杂的数据库查询。
    • 通常用于封装特定的、可重用的查询逻辑。
    • 可以被仓库类使用,也可以直接被服务类使用。
    • 示例: CompanyQuery
  3. 服务类 (Service):
    • 包含业务逻辑。
    • 协调多个仓库或查询类的操作。
    • 处理跨越多个领域的复杂操作。
    • 可以调用仓库类和查询类。
    • 示例: CompanyService

逻辑关系:

  1. 控制器 -> 服务类:
    • 控制器通常调用服务类来处理请求。服务类封装了业务逻辑,使控制器保持简洁。
  2. 服务类 -> 仓库类:
    • 服务类使用仓库类来获取或操作数据。这允许服务类专注于业务逻辑,而不是数据访问细节。
  3. 服务类 -> 查询类:
    • 对于复杂的查询,服务类可能直接使用查询类,特别是当查询逻辑不适合放在仓库类中时。
  4. 仓库类 -> 查询类:
    • 仓库类可能使用查询类来构建复杂的查询。这有助于保持仓库类的简洁和专注。
  5. 查询类 -> 模型:
    • 查询类通常直接操作Eloquent模型来构建查询。

一个典型的数据流可能如下:

控制器 -> 服务类 -> 仓库类 -> 查询类 -> 模型 -> 数据库

示例:

class CompanyController
{
    public function index(Request $request, CompanyService $service)
    {
        return $service->getFilteredCompanies($request->all());
    }
}

class CompanyService
{
    public function getFilteredCompanies(array $filters)
    {
        return $this->repository->getFiltered($filters);
    }
}

class CompanyRepository
{
    public function getFiltered(array $filters)
    {
        return CompanyQuery::applyFilters($filters)->get();
    }
}

class CompanyQuery
{
    public static function applyFilters($query, array $filters)
    {
        // 应用过滤逻辑
        return $query;
    }
}

种分层架构提供了几个好处:

  1. 关注点分离: 每个类都有明确的职责。
  2. 可测试性: 每一层都可以独立测试。
  3. 可维护性: 修改一层的逻辑不会影响其他层。
  4. 可重用性: 查询类和仓库类可以在多个服务类中重用。

根据项目的复杂度,您可能不需要所有这些层。对于简单的项目,可能只需要仓库类或服务类就足够了。随着项目的增长,您可以逐步引入更多的层来管理复杂性。

Last Updated:
Contributors: BaronYan
Prev
将用户定位到他的前缀域名
Next
接口和实现