Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/huang-yi/laravel-filter

Query filters for Laravel.
https://github.com/huang-yi/laravel-filter

filter laravel query

Last synced: about 16 hours ago
JSON representation

Query filters for Laravel.

Awesome Lists containing this project

README

        

# Laravel Filter

这个拓展包帮助开发者快速构建查询过滤器。

## 实例

现在有一个查询用户列表的任务,要求能够按性别、所在城市筛选。

一般情况下,我们可能会提前在Model里定义一系列的scope:

```php
where('gender', $gender);
}

/**
* Scope of cities.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $cityIds
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCities(Builder $query, $cityIds)
{
return $query->whereIn('city_id', (array) $cityIds);
}
}

```

然后在Controller里调用:

```php
input('gender')) {
$query->gender($gender);
}

if ($cities = explode(',', $request->input('cities'))) {
$query->cities($cities);
}

$users = $query->get();

return $users;
}
}

```

这样的实现看着还能接受,但往往现实需求中,需要过滤的往往不止两个条件,而且除了过滤外还有其他的业务逻辑,这样很容易引发Fat Controller的问题。

如果使用了该拓展包,代码是这样的:

1、 定义filter

```php
where('gender', $value);
}
}

```

```php
whereIn('cities', $value);
}
}

```

2、命名你的filter:

```php
applyFilters($query);

$users = $query->get();

return $users;
}
}

```

可以看到,虽然我们需要创建多个filter文件,但是Controller里面只需要一行代码就搞定了,所以无论需求有多少个过滤条件,都不会引起
Fat Controller的问题,如此实现是不是更加优雅?

开发者可能会担心创建filter很麻烦,不必慌张,你只需要敲一行Artisan命令就能快速创建filter到文件夹`app/Filtres/`,并自动注册
filter名到文件`app/filters.php`文件:

```sh
php artisan make:filter user.gender
```

## 快速开始

### 安装

使用composer安装:

```sh
composer require huang-yi/laravel-filter
```

### 注册服务(可选)

如果你正在使用版本号低于5.5的Laravel,需要手动注册服务,在`config/app.php`中填加:

```php
[
HuangYi\Filter\FilterServiceProvider::class,
],
];

```

### 配置(可选)

使用`vendor:publish`命令发布配置文件:

```sh
php artisan vendor:publish --provider="HuangYi\Filter\FilterServiceProvider"
```

执行上述命令后,会生成一个`config/filter.php`文件,即为该拓展包的配置文件。

一般来说,我们不需要修改任何配置,除非你有一些特殊的需求。

`key`:前端上传过滤器规则时使用的key,默认为`filters`。

`log_level`:设置日志等级,默认为`debug`。如果你想关闭日志,可以设置为`null`。

`parser`:规律器规则解析器。如果你想修改`filters`的参数格式,可以自行实现parser,但是parser类必须实现`HuangYi\Filter\Contracts\ParserContract`。

### 创建filter

使用命令`make:filter`快速创建filter:

```sh
php artisan make:filter user.gender
```

上述命令中`user.gender`为filter的名字,它会自动创建一个filter类到`app/Filters/`文件夹下面,并在文件`app/filters.php`中命名过滤器。

如果你不喜欢使用命令,则可以手动创建:

1、 创建一个filter类,你可以将其放至任何位置,只要满足`psr4`规范,但是它必须实现`HuangYi\Filter\Contracts\FilterContract`。

```php
where('gender', $value);
}
}

```

2、 命名你的filter:可以使用`HuangYi\Filter\Facades\Filter`的`name`方法来命名,默认系统会自动加载
`app/filters.php`,所以你可以在这个文件内进行命名。但你也可以在任意文件中执行,只要这个文件被系统require。

```php
apply()`。

```php
apply($query);

return $query->get();
});
```

### 前端构造filters规则

单个filter的结构:

```javascript
let filter = {
name: "user.gender",
value: "female"
}
```

然后将多个filter组合在一起,并生成json字符串:

```javascript
let filters = JSON.stringify([
{
name: "user.gender",
value: "female"
},
{
name: "user.cities",
value: [1, 2, 3]
}
]);
```

最后将json字符串做base64处理后发送给服务端:

```javascript
let Base64 = require('js-base64').Base64;
let axios = require('axios');

filters = Base64.encode(filters);

axios.get('/users', {
filters: filters
}).then((response) => {
console.log(response);
});
```

## License

Laravel Filter遵循[The MIT License (MIT)](http://opensource.org/licenses/MIT)开源许可。