webdevjohn / filterable
用于Laravel的Filterable eloquent模型
Requires
- php: ^7.3||^8.0
- laravel/framework: ^6.0||^7.0||^8.0||^9.0||^10.0||^11.0
This package is auto-updated.
Last update: 2024-09-19 16:03:13 UTC
README
简介
The Filterable package was created to provide an easy way to filter Laravel Eloquent models.
目的
- 提供一个简单的方法,通过HTTP GET和POST方法动态地过滤Eloquent模型。
- 提供一个简单的方法,通过方法调用手动过滤Eloquent模型。
- 将过滤逻辑封装在其自己的专用类中。
- 允许过滤逻辑在Eloquent模型之间重用。
- 遵循现代面向对象编程标准和设计模式。
工作原理
该包使用一个工厂来确定要应用于模型的哪些过滤器。工厂通过构造函数接受一个参数,即过滤器组件。过滤器组件用于指导过滤器工厂实例化哪些过滤器。这种方法允许您使用不同的组件拥有多个不同实例的过滤器工厂,这些组件可以改变其行为。
请求输入用于构建特定模型的过滤器。例如,查询字符串参数 "year_released" 将实例化 "YearReleasedFilter" 类并将过滤器应用于模型。
安装
composer require webdevjohn/filterable
配置
完成以下步骤。
- 步骤 1: 创建和配置过滤器组件。
- 步骤 2: 过滤器工厂设置。
- 步骤 3: 创建过滤器。
- 步骤 4: 将Filterable特质添加到您想要过滤的模型中。
步骤 1 - 创建和配置过滤器组件
过滤器组件的目的是指导过滤器工厂实例化哪些过滤器。可以在 getInstantiableFilters() 方法中列出特定模型可以实例化的过滤器列表。这些过滤器也可以通过修改 getInstantiableFiltersNamespace() 方法返回的命名空间来组织。
要使用Laravel项目的命令行创建过滤器组件,请输入以下Artisan命令,指定组件的名称。
php artisan filter:component {NameOfComponent}
您可以根据自己的喜好命名过滤器组件类。过滤器组件的唯一要求是它必须实现 FilterComponentInterface。
新创建的过滤器组件将默认放置在 App\Filters\Components 目录和命名空间中。
您可以通过传递可选的第二个参数来覆盖默认目录/命名空间。
php artisan filter:component {NameOfComponent} {namespace}
步骤 2 - 过滤器工厂设置
步骤 1中创建的过滤器组件需要注入到 FilterFactory 的构造函数参数中。您可以通过绑定过滤器工厂实例并注入过滤器组件来实现这一点。
打开 App/Providers/AppServiceProvider.php 文件,在 register() 方法中为 FilterFactory 创建一个新的绑定,指定工厂的别名。然后使用 $app->make() 方法将组件传递给 FilterFactory 构造函数。
您可以使用以下代码作为模板,将“FactoryAlias”和“YourComponent”替换掉。
App/Providers/AppServiceProvider.php
public function register()
{
$this->app->bind('FactoryAlias', function ($app) {
return new \Webdevjohn\Filterable\FilterFactory(
$app->make(\App\Filters\Components\YourComponent::class)
);
});
}
步骤 3- 创建过滤器
创建的过滤器将默认放置在 App\Filters 目录和命名空间中。
php artisan filter:make {FilterName}
您可以通过传递可选的第二个参数来覆盖默认目录/命名空间。
php artisan filter:make {FilterName} {namespace}
为特定模型创建过滤器后,您需要更新过滤器组件上的 getInstantiableFilters() 方法,以便工厂可以创建过滤器。
步骤 4- Filterable 特质
将可过滤特性添加到您想进行过滤的模型中
use Webdevjohn\Filterable\Traits\Filterable;
可过滤特性向模型公开了 getFilterFactory() 方法,并用于从 IOC(控制反转)容器中检索 FilterFactory 实例。
public function getFilterFactory(string $factory)
{
return app()->make($factory);
}
您还需要将以下代码片段添加到您的模型中,将 'YourFilterFactory' 替换为步骤 2 中设置的工厂的名称(别名)
scopeFilters 方法提供了对步骤 2 中在 IOC 容器中设置的 FilterFactory 的便捷访问。
public function scopeFilters($query, $request)
{
return $this->getFilterFactory('YourFilterFactory')->make($query, $request);
}
用法
以下示例是从存储库中调用 Filters() 方法,但如果直接在模型或控制器中使用,概念是相同的。
对于您现有的任何查询,您都可以调用 Filters() 方法,传入 $request->input()。这将动态实例化并将过滤器应用于模型。
public function getLatestTracks($request)
{
return $this->model->WithRelations()
->Filters($request->input())
->orderBy('purchase_date', 'DESC')
->take(12)
->get()
}