alvariumsoft/laravel-filters

Laravel 过滤器。

1.0.6 2020-03-31 14:36 UTC

This package is not auto-updated.

Last update: 2024-10-01 04:08:49 UTC


README

Laravel 6 License

Laravel-6 的过滤器包

  • 用于商店和目录的过滤器。
  • SEO 和 GET 参数。
  • 缓存。
  • 使用默认设置。
  • 提供一系列示例,可以修改以满足特定任务。

安装

使用 Composer 安装包。

composer require alvariumsoft/laravel-filters

将以下内容添加到项目中的 config/app.php 文件的 providers 数组末尾

Alvarium\Filters\FiltersServiceProvider::class,

之后,在控制台执行发布所需资源的命令

php artisan vendor:publish --provider="Alvarium\Filters\FiltersServiceProvider"

使用方法

config/filters.php 文件中的数组指定了服务器的类。例如

'state' => \App\Alvarium\Filters\Services\Data\Defaults\DefaultState::class,

自己的服务类需要创建在 app/Alvarium 文件夹中。

服务类应该有相应的命名空间:namespace App\Alvarium\Filters\Services\Data。同样,服务类应该包含相应的接口并实现其方法。

示例

在发布的文件夹 Defaults(App\Alvarium\Filters\Services\Data\Defaults)中有所有默认服务的示例。对于大多数情况,这些已经足够了。如果需要修改或添加功能,我们可以根据示例创建自己的服务并在配置文件中添加它们。

工作原理

假设我们有以下表和相应的模型(列出主要字段)

categories:
id
name
slug
category_id

products:
id
name
price
properties - json
category_id

properties:
id
name
type
sort

property_enums:
id
property_id
value
slug
sort

products 表中的属性应存储在字段 properties(json)中,如下所示

{"property_1": "property_value_2", "property_2": "property_value_4", "property_3": "property_value_11", "property_4": "property_value_22", "property_5": "property_value_24", "property_9": "property_value_54", "property_10": "property_value_55"}

其中值是 slug property_enums。如果您的字段或表结构相似但名称不同,您可以在服务 \App\Alvarium\Filters\Services\Data\Defaults\DefaultState::class 中简单地重命名它们。

我们有一个用于子类别的过滤器路由

Route::get('/catalog/{category}/{subcategory}/filter/{param1?}/{param2?}', 'CategoryController@subcategory')->name('subcategory');

即前两个过滤器参数将进入段,其余的将进入 GET 参数。

我们有控制器操作

    // Класс фильтров регистрируется в сервис контейнере в сервис провайдере, поэтому мы можем сделать инъекцию прямо в контроллере.
    public function subcategory(Filters $filters, Request $request, Category $category, Category $subcategory, ...$params)
    {
        $categories = Category::with('categories')->whereNull('category_id')->get();

        // Получаем менеджер фильтров, передаем параметры в сегментах, все GET-параметры, название маршрута, параметры не являющиеся фильтрами
        $filterManager = $filters->getManager($params, $request->all(), 'subcategory', [$category, $subcategory]);

        // Получаем массив фильтров
        $filters = $filterManager->getFilters();
        // Получаем массив выбрвнных фильтров
        $chosenFilters = $filterManager->getChosenFilters($filters);

        // Получаем ид отфильтрованных товаров
        $productIds = $filterManager->getProductIds(Product::where('category_id', $subcategory->id));

        $products = Product::with('category')->whereIn('id', $productIds)->paginate(10);

        return view('catalog', compact('categories', 'products', 'filters', 'chosenFilters'));
    }

服务

app/Alvarium 文件夹中发布服务文件夹的结构和所有默认服务,这些服务适用于大多数情况。您可以按照示例创建自己的服务并在 config/filters.php 文件中重新连接它们。

        'state' => \App\Alvarium\Filters\Services\Data\Defaults\DefaultState::class,

服务用于对数据库进行查询并从数据库获取所有未处理的数据。它被实现为单例,以避免重复查询并在任何其他服务中提供访问。建议所有数据库查询都只在这里执行,然后通过服务进行处理。

        'raw_data' => \App\Alvarium\Filters\Services\Data\Defaults\DefaultRawData::class,

服务用于处理从数据库获取的数据,提取和分组过滤器。这是最费时的部分,因此其结果被缓存。您需要自行在数据库数据更新时手动清除缓存。缓存时间在配置文件中定义。

        'receive_filter' => \App\Alvarium\Filters\Services\Filters\Defaults\DefaultReceiveFilter::class,

服务用于生成过滤器类,也需要创建类。过滤器类负责从原始数据中形成最终数据。服务负责确定创建哪些类的对象。

        'filters_creator' => \App\Alvarium\Filters\Services\Filters\Defaults\DefaultFiltersCreator::class,

生成结果数组的服务,这里可以更改其结构。数组是通过上一服务中描述的类形成的。

        'links_creator' => \App\Alvarium\Filters\Services\Links\Defaults\DefaultLinksCreator::class,

生成链接的服务。

    'middleware' => [
        \App\Alvarium\Filters\Services\Middleware\Defaults\SortFilters::class,
    ],

在此配置文件部分中,我们指定按顺序执行并执行对生成的过滤器的额外操作的中间件类。它们都应该实现 Alvarium\Filters\Middlewares\Middleware 接口。默认实现排序过滤器。

        'params_strategy' => \App\Alvarium\Filters\Services\Params\Defaults\DefaultParamsStrategy::class,

解析传入参数的服务,也可以在这里定义哪些在段中,哪些在 GET 参数中。

        'query_decorator' => \App\Alvarium\Filters\Services\Queries\Defaults\DefaultQueryDecorator::class,

装饰所选过滤器的所有请求的服务,以过滤产品。我们也在此命名空间中定义请求本身。