ilyasavich/filter

laravel 应用程序的过滤器服务

v1.1.0 2017-02-17 14:41 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:58:15 UTC


README

laravel 的过滤器服务

安装

要安装,您只需要求包

composer require ilyasavich/filter

用法

创建服务

首先,您需要从 Savich\Filter\Kernel 类扩展,与服务通信将通过此类提供

use Savich\Filter\Kernel;

class YourFilterKernel extends Kernel
{
}

创建自定义过滤器

创建类

要创建您的自定义过滤器,您需要从 Savich\Filter\Contracts\Filter 类扩展

use Savich\Filter\Contracts\Filter;

class YourCustomFilter extends Filter
{
}

初始化自定义过滤器

在创建的 YourCustomFilter 类中,您必须实现 3 个方法

  • 第一个方法是 alias()。您需要指定过滤器的别名,并在返回语句中指定。通过此别名,系统将搜索过滤器类。

  • 第二个,您需要实现 modelNamespace() 方法。在那里,您需要在返回语句中指定模型命名空间。过滤器将应用于此模型。

  • 最后,您需要实现 build() 方法。在那里,您可以指定过滤器的查询逻辑。

示例

use Savich\Filter\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;
use My\Model\Namaspace\MyModel;

class YourCustomFilter extends Filter
{
    public function alias()
    {
        return 'filter_alias';
    }
    
    public function modelNamespace()
    {
        return MyModel::class;
    }
    
    public function build(Builder $query)
    {
        return $query->where('id', '!=', 1); // example query
    }
}

注册您的过滤器

要向系统说明您的过滤器,只需覆盖过滤器内核中的 $filters 字段,并将您的自定义过滤器添加到此数组中。示例

use Savich\Filter\Kernel;

class YourFilterKernel extends Kernel
{
    protected $filters = [
        YourCustomFilter::class,
    ];
}

使用过滤器特质

如果您想在模型中使用过滤器,您需要使用 Filter 特质。

use Savich\Filter\Mixins\Filter;

class YourModel extends Model
{
    use Filter;
}

使用

要使用系统,您需要调用过滤器内核类中的 make() 方法。示例

use Namespace\Of\YourFilterKernel;

$kernel = YourFilterKernel::instance();
$kernel->make();
// or
$kernel->make($arrayOfFilterAliases);

// or through models

YourModel::filter()->get();
// or
YourModel::filter($filters)->get();

在模型中使用过滤器的情况下,方法 filter 返回 Illuminate\Database\Eloquent\Builder 实例,这样您就可以在查询链中使用它。

会发生什么?

默认情况下,方法 make() 将从 URL 参数中获取过滤器别名,并在您在内核中注册的过滤器中尝试找到它们。如果您在 make 方法中传递过滤器数组,它将通过这些过滤器进行过滤。然后,它将按模型命名空间对过滤器进行分组,并为每个组构建查询。方法 make 返回一个数组,其中键是模型命名空间,值是 Illuminate\Database\Eloquent\Builder 实例。

工作示例

例如,您尝试通过以下 URL 过滤数据:http://domain.com/url/path?0=filter1&1=filter2%3Aparam1%2Cparam2&2=filter2%3Aparam3 URL 参数具有以下表示:['filter1', 'filter2:param1,param2', 'filter2:param3']

use Savich\Filter\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;
use My\Model\Namaspace\MyModel;

class Filter1 extends Filter
{
    public function alias()
    {
        return 'filter1';
    }
    
    public function modelNamespace()
    {
        return MyModel::class;
    }
    
    public function build(Builder $query)
    {
        return $query->where('id', '!=', 1); // example query
    }
}
==========================================

use Savich\Filter\Contracts\Filter;
use Illuminate\Database\Eloquent\Builder;
use My\Model\Namaspace\MyModel;

class Filter2 extends Filter
{
    public function alias()
    {
        return 'filter2';
    }
    
    public function modelNamespace()
    {
        return MyModel::class;
    }
    
    public function build(Builder $query)
    {
        return $query->whereIn('id', '!=', $this->parameters); // example query
    }
}
==========================================

use Savich\Filter\Kernel;

class YourFilterKernel extends Kernel
{
    protected $filters = [
        Filter1::class,
        Filter2::class,
    ];
}
==========================================

use Namespace\Of\YourFilterKernel;

$kernel = YourFilterKernel::instance();
$kernel->make();
// or
$kernel->make($arrayOfFilterAliases);

方法 make 将返回关联数组

array (size=1)
  'My\Model\Namaspace\MyModel' => object(Illuminate\Database\Eloquent\Builder)

URL 传递参数

因此,您需要在 URL 中将过滤器设置为数组,过滤器的参数是可选的。示例获取到的数组,['filter1', 'filter2:param1,param2', 'filter2:param3'] 参数可以使用,例如,当您需要在用户表的角色上应用过滤器时。

您有多个过滤器

  • 用于用户角色
  • 用于管理员角色
  • 用于发布者角色等。

您可以设置为

  • role:user
  • role:admin
  • role:publisher

并将它们添加到 URL 中。它将看起来像 ['role:user', 'role:admin', 'role:publisher']

系统将解析每个过滤器,创建一个具有别名 role 的单个类,并将 useradminpublisher 设置到您的自定义过滤器中的 $parameters 数组中。这就是您可以在上面看到的内容中那里

一些自定义设置

自定义组名

如果您需要自定义分组名称,不想按照整个模型命名空间进行分组,您可以做一些定制,可能不如您想要的或需要的那么多,但您仍然可以在您的过滤器内核类中覆盖方法 getGroupName() 来实现这一点,该方法接受一个参数,即模型命名空间。

use Savich\Filter\Kernel;

class YourFilterKernel extends Kernel
{
    protected function ($modelNamspace)
    {
        $groupName = lowercase($modelNamespace); // example
        
        return $groupName; 
    }
}

如果您有任何改进的建议,如果这确实是必要的,请给我发电子邮件。