ilyasavich / filter
laravel 应用程序的过滤器服务
Requires
- illuminate/database: ^5.2
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
的单个类,并将 user
、admin
和 publisher
设置到您的自定义过滤器中的 $parameters
数组中。这就是您可以在上面看到的内容中那里
一些自定义设置
自定义组名
如果您需要自定义分组名称,不想按照整个模型命名空间进行分组,您可以做一些定制,可能不如您想要的或需要的那么多,但您仍然可以在您的过滤器内核类中覆盖方法 getGroupName()
来实现这一点,该方法接受一个参数,即模型命名空间。
use Savich\Filter\Kernel;
class YourFilterKernel extends Kernel
{
protected function ($modelNamspace)
{
$groupName = lowercase($modelNamespace); // example
return $groupName;
}
}
如果您有任何改进的建议,如果这确实是必要的,请给我发电子邮件。