mobileka/scope-applicator-laravel

Laravel框架的Scope Applicator绑定。

1.1.2 2016-10-10 00:23 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:21:18 UTC


README

Build Status Code Climate Coverage Status

如果您正在寻找与Laravel 4.x.x和5.0.x兼容的版本,请点击这里

ScopeApplicator为您的Laravel项目带来了优雅的数据排序和过滤方式。

概述

ScopeApplicator是以简单和逻辑的方式实现类似这样功能的方法

/posts – 返回所有文章列表

/posts?recent – 仅返回最新文章

/posts?author_id=5 – 返回ID为5的作者的帖子

/posts?author_id=5&order_by_title=desc&status=active – 仅返回ID为5的作者的活动帖子,并按标题降序排列

要求

Laravel ~5.1

安装

composer require mobileka/scope-applicator-laravel 1.1.*

使用(与模型一起)

在深入之前,请确保您熟悉Laravel的查询作用域

让我们通过例子来学习。首先,我们将为posts表实现一个author_id过滤器。

请注意,这将是一个基本的例子,并不是做事的最优方式 ;)

以下步骤是实现这个功能的必要步骤

  1. 创建一个基本的PostController,当您访问/posts路由时,它会输出帖子列表
  2. Post模型中创建一个userId作用域(并必须扩展Mobileka\ScopeApplicator\Laravel\Model类)
  3. 告诉ScopeApplicator这个作用域是可用的,并为其提供一个别名
  4. 访问/posts?author_id=1并享受结果

好的,让我们一步步来解决这个问题。

PostController

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        return Post::all();
    }
}

Post模型

<?php namespace App\Models;

use Mobileka\ScopeApplicator\Laravel\Model;

class Post extends Model
{
    public function scopeUserId($builder, $param = 0)
    {
        if (!$param) {
            return $builder;
        }
        
        return $builder->where('user_id', '=', $param);
    }
}

注意,它扩展了Mobileka\ScopeApplicator\Laravel\Model

现在我们必须将控制器中的Post::all()替换为Post::handleScopes(),并告诉这个方法哪些作用域可用于过滤

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Models\Post;

class PostController extends Controller
{
    // an array of available scopes
    public $scopes = [
        'userId'
    ];

    public function index()
    {
        return Post::handleScopes($this->scopes)->get();
    }
}

请注意,'userId'与我们创建的Post模型中的作用域名称匹配(scopeUserId)。

此时,您可以在posts表中添加一些示例数据,并确保您可以通过以下路由过滤它:/posts?userId=your_number

但是,因为我们想要author_id而不是userId,所以让我们为这个作用域创建一个别名

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Models\Post;

class PostController extends Controller
{
    // an array of available scopes
    public $scopes = [
        'userId' => [
            // Here it is!
            'alias' => 'author_id'
        ]
    ];

    public function index()
    {
        return Post::handleScopes($this->scopes)->get();
    }
}

— 这就完成了!现在您可以通过访问/posts?author_id=x来查看结果。

alias只是许多可用作用域配置选项之一。这些选项在ScopeApplicator的文档中有详细描述。

更好的使用场景(与存储库一起)

ScopeApplicator还可以与存储库一起使用。它实际上是为这种方式设计的。

为了实现这一点,您的存储库必须扩展Mobileka\ScopeApplicator\Laravel\Repository类。

ScopeApplicator已经附加到这个类上,因此您将在扩展它的存储库中获得一个新的applyScopes()方法。

让我们看看一个在扩展上述类之前的BaseRepository的例子

<?php namespace Acme\Repositories;

class BaseRepository
{
    protected $dataProvider;
    
    public function __construct($dataProvider)
    {
        $this->dataProvider = $dataProvider;
    }
    
    public function getDataProvider()
    {
        return $this->dataProvider;
    }
    
    public function all()
    {
        return $this->getDataProvider()->all();
    }
}

DataProvider通常是一个Model的实例。

现在,让我们看看带有ScopeApplicator的它是什么样子

<?php namespace Acme\Repositories;

use Mobileka\ScopeApplicator\Laravel\Repository;

class BaseRepository extends Repository
{
    protected $dataProvider;
    
    public function __construct($dataProvider)
    {
        $this->dataProvider = $dataProvider;
    }
    
    public function getDataProvider()
    {
        return $this->dataProvider;
    }
    
    public function all($scopes = [])
    {
        // This part has to be noticed!
        return $this->applyScopes($this->getDataProvider(), $scopes)->get();
    }
}

更仔细地关注 all 方法。现在它接受一个作用域数组(与之前传递给 Model::handleScopes() 的同一个数组)。

我们现在使用 applyScopes() 方法,而不是直接在 DataProvider 上调用 all,该方法接受一个 DataProvider 实例作为第一个参数和一个作用域配置数组作为第二个参数。

贡献

如果你发现了一个错误或有建议,你始终可以创建一个问题或拉取请求(使用 PSR-2)。我们将讨论问题或建议,并共同制定实现计划。

许可证

ScopeApplicator 是一个开源软件,遵循 MIT 许可协议