Skip to main content

Laravel l5-repository 评估与使用指南

l5-repository 是一个流行的 Laravel 包,用于实现 Repository 模式,帮助构建更清晰、更可维护的应用程序架构。

1. 基本介绍

主要功能

  • 提供标准的 Repository 接口实现
  • 简化数据访问层的构建
  • 支持缓存集成
  • 提供查询条件构建器
  • 自动处理分页

优缺点分析

优点: ✅ 减少控制器中的业务逻辑
✅ 提高代码可测试性
✅ 统一数据访问接口
✅ 内置缓存支持
✅ 简化复杂查询构建

缺点: ❌ 学习曲线稍陡
❌ 对简单项目可能过度设计
❌ 项目活跃度下降(最后更新2020年)

2. 安装与配置

安装

composer require prettus/l5-repository

发布配置

php artisan vendor:publish --provider="Prettus\Repository\Providers\RepositoryProvider"

配置文件

// config/repository.php
return [
    'repository' => [
        'cache' => [
            'enable'   => env('REPOSITORY_CACHE', true),
            'minutes'  => 30,
            'clean'    => true
        ]
    ]
];

3. 基础使用

创建 Repository

php artisan make:repository PostRepository

典型 Repository 结构

namespace App\Repositories;

use App\Models\Post;
use Prettus\Repository\Eloquent\BaseRepository;

class PostRepository extends BaseRepository
{
    public function model()
    {
        return Post::class;
    }
    
    public function published()
    {
        return $this->scopeQuery(function($query){
            return $query->where('status', 'published');
        })->all();
    }
}

在控制器中使用

public function index(PostRepository $repository)
{
    $posts = $repository->with(['author', 'comments'])->paginate(10);
    return view('posts.index', compact('posts'));
}

4. 高级功能

查询条件构建

$posts = $repository
    ->where('category_id', 1)
    ->orderBy('created_at', 'desc')
    ->paginate(15);

缓存集成

// 自动缓存结果
$repository->skipCache()->all(); // 跳过缓存
$repository->withCache(60)->find(1); // 自定义缓存时间

自定义 Criteria

namespace App\Repositories\Criteria;

use Prettus\Repository\Contracts\CriteriaInterface;
use Prettus\Repository\Contracts\RepositoryInterface;

class ActiveUsersCriteria implements CriteriaInterface
{
    public function apply($model, RepositoryInterface $repository)
    {
        return $model->where('active', true);
    }
}

// 使用
$repository->pushCriteria(new ActiveUsersCriteria())->all();

5. 替代方案比较

特性 l5-repository Spatie Query Builder 手动实现
Repository 模式
查询构建
自动缓存
活跃维护
学习曲线 中等 简单 灵活
适合项目规模 中大型 中小型 任意

6. 最佳实践建议

  1. 合理使用范围

    • 适合业务逻辑复杂的项目
    • 简单CRUD应用可能不需要
  2. 分层架构

    Controller -> Service -> Repository -> Model
    
  3. 缓存策略

    • 高频读取数据使用缓存
    • 写操作清除相关缓存
  4. 测试友好

    // 测试中可轻松模拟Repository
    $mock = $this->mock(PostRepository::class);
    $mock->shouldReceive('find')->andReturn(new Post());
    

7. 升级替代方案

如果担心项目维护状态,可以考虑:

  1. Spatie Laravel Query Builder

    composer require spatie/laravel-query-builder
    
  2. 自定义实现

    interface RepositoryInterface {
        public function all();
        public function find($id);
        // ...
    }
    
  3. 其他活跃的Repository包

    • rinvex/repository
    • bosnadev/repositories

结论

l5-repository 仍然是一个功能强大的工具,特别适合已经使用它的遗留项目。对于新项目,建议评估更活跃维护的替代方案或根据项目复杂度选择手动实现Repository模式。