timedoor/laravel-filter

用于从请求中过滤数据的包

v1.1.3 2024-06-24 06:53 UTC

README

此包用于以简单的方式从请求中过滤数据。

安装

您可以通过composer安装此包

composer require timedoor/laravel-filter

用法

创建过滤器类

php artisan make:filter UserFilter

默认情况下,所有过滤器类都存储在app/Http/Filters文件夹中。如果您想将其存储在另一个文件夹中,您可以传递完整的命名空间而不是名称

php artisan make:filter App/Foo/Bar/YourFilter

成功创建过滤器类后,它将如下所示

<?php

namespace App\Filters;

class UserFilter
{
    public function keyword($builder, $value)
    {
        //
    }
}

使用Filterable特性

在您的模型中添加Filterable特性。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Timedoor\LaravelFilter\Concerns\Filterable;

class User extends Model
{
    use Filterable; 
}

过滤数据

完成所需设置后,现在您可以在控制器中过滤数据

use App\Http\Filters\UserFilter;

$users = User::applyFilter(UserFilter::class)->get();

案例

假设您的应用程序在 http://your-domain.com 内部,并且您想通过用户名称过滤用户数据,因此请求如下所示 http://your-domain.com?name=John,您可以这样处理它

// app/Http/Filters/UserFilter.php

<?php

namespace App\Filters;

class UserFilter
{
    public function name($builder, $value)
    {
        return $builder->where('name', 'LIKE', "%{$value}%");
    }
}
// app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use App\Models\User;

class HomeController extends Controller
{
    public function index()
    {
        $users = User::applyFilter(UserFilter::class)->get()
        
        return $users;
    }
}

高级用法

使用自定义Laravel查询构建器

如果您想使用自己的Laravel查询构建器,需要按照以下设置操作

// app/QueryBuilders/UserQueryBuilder.php

<?php

namespace App\QueryBuilders;

use Timedoor\LaravelFilter\LaravelFilterQueryBuilder;

class UserQueryBuilder extends LaravelFilterQueryBuilder
{

}

确保您的查询构建器已扩展到LaravelFilterQueryBuilder类

// app/Models/User.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Timedoor\LaravelFilter\Concerns\Filterable;
use App\QueryBuilders\UserQueryBuilder;

class User extends Model
{
    use Filterable; 
    
    /**
     * Create a new Eloquent query builder for the model.
     *
     * @param  \Illuminate\Database\Query\Builder  $query
     * @return \App\QueryBuilders\UserQueryBuilder
     */
    public function newEloquentBuilder($query)
    {
        return new UserQueryBuilder($query);
    }

    /**
     * @param  stdClass  $subject
     * @param  \Illuminate\Http\Request|null  $request
     * @param  array<string, mixed>  $options
     * @return \App\QueryBuilders\UserQueryBuilder
     */
    public static function applyFilter($subject, $options = [], Request $request = null)
    {
        /** @var \App\QueryBuilders\UserQueryBuilder $builder */
        $builder = (new static)->newQuery();

        return $builder->applyFilter($subject, $options, $request);
    }
}

现在您可以使用自己的查询构建器实现过滤。

使用选项

有两个选项可用 includeexclude,您可以在applyFilter()方法中传递这些选项

User::applyFilter(UserFilter::class, [
    'include' => [
        'name' => 'John',
        'email' => 'fhuel@example.org'
    ],
    'exclude' => ['address']
])

包含

此选项是在您想要调用过滤方法即使请求参数未设置的情况下使用的。例如,您想按用户名称过滤用户,并且您的端点如下所示 https:///user?name=John。但如果请求没有 name 查询,您的过滤方法将不会调用。如果您想始终调用您的过滤方法即使请求没有查询,您可以使用 include 选项

User::applyFilter(UserFilter::class, [
    'include' => ['name' => 'John']
])

排除

此选项用于防止调用过滤方法。例如,您在过滤类中有一个 name() 方法,并且请求查询如下所示 https:///user?name=John。但您不希望 name() 方法被调用,您可以使用排除选项

User::applyFilter(UserFilter::class, [
    'exclude' => ['name']
])

链式过滤

如果您想使用多个过滤类,您可以链式调用 applyFilter 方法,因此它看起来像这样

User::applyFilter(Foo::class)
    ->applyFilter(Bar::class)
    ->get()

测试

composer test

更新日志

有关最近更改的更多信息,请参阅 更新日志

贡献

有关详细信息,请参阅 贡献指南

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅 许可证文件