ahmmmmad11/filters

一个包装包,用于在Laravel应用程序中简化过滤器创建,基于spatie查询构建器包

0.4.03 2024-04-14 18:37 UTC

This package is not auto-updated.

Last update: 2024-09-29 20:38:20 UTC


README

Latest Version on Packagist GitHub Code Style Action Status Total Downloads

安装

您可以通过composer安装此包

composer require ahmmmmad11/filters

安装后,您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="filters-config"

这是已发布配置文件的内容

return [
    /*
    |--------------------------------------------------------------------------
    | Filters Path
    |--------------------------------------------------------------------------
    |
    | This value is the path where your filter class will be created.
    |
    */

    'path' => '\Http\Filters',

    /*
    |--------------------------------------------------------------------------
    | pagination rows
    |--------------------------------------------------------------------------
    |
    | The `per_page` value indicates the default pagination size. 
    | If the 'per_page' argument is not provided or there is no 
    | paginate query in the request, this value will be used.
    |
    */

    'per_page' => 100,
];

用法

创建您的第一个过滤器

php artisan filter:make UsersFilter --model=User

这将在“app/Http/Filters”目录中生成一个UsersFilter类。然后您可以根据应用程序的需求进行自定义。

    <?php

    namespace App\Http\Filters;
    
    use Ahmmmmad11\Filters\Filter;
    use App\Models\User;
    use Spatie\QueryBuilder\QueryBuilder;
    
    class UsersFilter extends Filter
    {
        public function filter(): Filter
        {
            $this->data = QueryBuilder::for(User::class)
                ->allowedFilters(
                    ["id","name","email","email_verified_at","created_at","updated_at"]
                );
    
            return $this;
        }
    }

当然!以下是您的指令的重新表述版本

如果您遵循正确的命名约定,则可以省略--model选项。例如,如果您有一个User模型,您可以使用以下简化的命令

    php artisan filter:make UsersFilter

在这种情况下,由于您使用了模型的复数形式(User变为“Users”),或者如果您更喜欢单数形式(UserFilter),过滤器命令将自动将其与User模型关联。

请注意,此规则不适用于组合模型名称,如UserProduct。在这种情况下,请显式指定模型,使用--model=UserProduct选项或简短形式-m"UserProduct"

现在您可以通过在控制器中注入UserFilter来使用过滤器

...

use App\Http\Filters\UsersFilter;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index(UsersFilter $filter)
    {
        return $filter->get();
    }
}

或者您可能想返回分页数据

    ...
    
    public function index(UsersFilter $filter)
    {
        return $filter->paginate(30);
    }

如果您想从客户端分配分页表单的大小,可以通过将分页参数留空来实现

    $filter->paginate();

    // https://example.com/users?per_page=10

如果paginate方法的rows参数留空且请求查询中没有?paginate,则将使用filters.php配置中的默认行大小。

扩展Eloquent方法

您可以通过向execute方法传递callback直接从您的方法中自定义查询。

// UsersController

public function index(UsersFilter $filter)
{
    return $filter->execute(function ($query) {
        $query->where('status', 'active');
    })->get();
}

execute回调函数中,您可以使用所有Eloquent方法。

包含关系

要包含模型关系,请向过滤器创建命令添加选项--relations

php artisan filter:make UsersFilter  --relations

或简短形式

php artisan filter:make UsersFilter -r

这将生成

//UserFilter Class

public function filter(): Filter
    {
        $this->data = QueryBuilder::for(User::class)
            ->allowedFilters(
                [...filters]
            )
            ->allowedIncludes(
                [...relations]
            );

        return $this;
    }

有关更多详细信息,请参阅Spatie Laravel-query-builder

测试

composer test

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING以获取详细信息。

安全漏洞

请查阅我们如何报告安全漏洞的安全策略

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。