webdevjohn/filterable

用于Laravel的Filterable eloquent模型

2.1.6 2024-03-19 14:40 UTC

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()
}