alvariumsoft / laravel-filters
Laravel 过滤器。
Requires
- php: ^7.2
- laravel/framework: ^6.2
This package is not auto-updated.
Last update: 2024-10-01 04:08:49 UTC
README
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,
装饰所选过滤器的所有请求的服务,以过滤产品。我们也在此命名空间中定义请求本身。