Skip to content

Commit 3f93b8f

Browse files
author
oooiik
committed
add createFilter
1 parent 0881bf7 commit 3f93b8f

File tree

6 files changed

+80
-69
lines changed

6 files changed

+80
-69
lines changed

src/Console/MakeQueryFilter.php renamed to src/Console/MakeFilter.php

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66
use Illuminate\Filesystem\Filesystem;
77
use Symfony\Component\Console\Exception\InvalidArgumentException;
88

9-
class MakeQueryFilter extends Command
9+
class MakeFilter extends Command
1010
{
1111
/**
1212
* The filesystem instance.
1313
*
1414
* @var Filesystem
1515
*/
1616
protected $files;
17-
protected $modelName;
1817

19-
protected $signature = 'make:query-filter {model}';
18+
/** @var string $className */
19+
protected $className;
20+
21+
protected $signature = 'make:filter {name}';
2022

2123
protected $description = 'Create a new query filter class';
2224

@@ -29,11 +31,18 @@ public function __construct(Filesystem $files)
2931

3032
public function handle()
3133
{
32-
$model = $this->argument('model');
33-
$this->setModelName($model);
34+
$name = $this->argument('name');
35+
$this->setFilterName($name);
3436
$this->buildClass();
3537
}
3638

39+
public function setFilterName($name){
40+
$class = '\\App\\Filters\\' . $name;
41+
if (class_exists($class)) {
42+
throw new InvalidArgumentException('Class exists!');
43+
}
44+
$this->className = $name;
45+
}
3746

3847
protected function buildClass()
3948
{
@@ -48,57 +57,30 @@ protected function buildClass()
4857

4958
protected function getGenerationPath()
5059
{
51-
return app_path('Filters/Query/' . $this->getGenerationClassName() . '.php');
60+
return app_path('Filters/' . $this->className . '.php');
5261
}
5362

5463
protected function getGenerationDir()
5564
{
56-
return app_path('Filters/Query');
57-
}
58-
59-
protected function getGenerationClassName()
60-
{
61-
return $this->modelName . 'QueryFilter';
62-
}
63-
64-
protected function hasModel($model)
65-
{
66-
return class_exists($model);
67-
}
68-
69-
protected function setModelName($model)
70-
{
71-
$modelClass = '\\App\\Models\\' . $model;
72-
if (!$this->hasModel($modelClass)) {
73-
throw new InvalidArgumentException('Model not found!');
74-
}
75-
$this->modelName = class_basename($model);
65+
return app_path('Filters');
7666
}
7767

7868
protected function replaceStub()
7969
{
80-
$stub = str_replace(
70+
return str_replace(
8171
['{{ namespace }}', '{{ class }}'],
82-
[$this->getNamespace(), $this->getClassName()],
72+
[$this->getNamespace(), $this->className],
8373
$this->getStub()
8474
);
85-
86-
return $stub;
8775
}
8876

8977
protected function getStub()
9078
{
91-
return $this->files->get(__DIR__ . '/stubs/query-filter.stub');
79+
return $this->files->get(__DIR__ . '/stubs/filter.stub');
9280
}
9381

9482
protected function getNamespace()
9583
{
96-
return 'App\Filters\Query';
84+
return 'App\Filters';
9785
}
98-
99-
protected function getClassName()
100-
{
101-
return $this->modelName . 'QueryFilter';
102-
}
103-
10486
}

src/Console/stubs/query-filter.stub renamed to src/Console/stubs/filter.stub

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace {{ namespace }};
44

5-
use Oooiik\LaravelQueryFilter\QueryFilter\QueryFilter;
5+
use Oooiik\LaravelQueryFilter\Filters\QueryFilter;
66

77
class {{ class }} extends QueryFilter
88
{

src/QueryFilter/QueryFilter.php renamed to src/Filters/QueryFilter.php

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,50 @@
11
<?php
22

3-
namespace Oooiik\LaravelQueryFilter\QueryFilter;
3+
namespace Oooiik\LaravelQueryFilter\Filters;
44

55
use Illuminate\Database\Eloquent\Builder;
66

77
abstract class QueryFilter
88
{
99
/** @var Builder */
1010
protected $builder;
11+
/** @var Builder */
12+
protected $realBuilder;
1113

1214
public function __construct(Builder $builder)
1315
{
14-
$this->builder = $builder;
16+
$this->realBuilder = $builder;
17+
$this->builder = clone $this->realBuilder;
1518
}
1619

1720
public static function builder(Builder $builder)
1821
{
1922
return new static($builder);
2023
}
2124

22-
public function filters(){
25+
public function filters()
26+
{
2327
$staticClassMethods = get_class_methods(static::class);
2428
$selfClassMethods = get_class_methods(self::class);
2529
return array_diff($staticClassMethods, $selfClassMethods);
2630
}
2731

28-
public function apply(array $validated){
29-
foreach ($this->filters() as $filter){
30-
if(in_array($filter, array_keys($validated))){
32+
public function apply(array $validated)
33+
{
34+
foreach ($this->filters() as $filter) {
35+
if (in_array($filter, array_keys($validated))) {
3136
$this->$filter($validated[$filter], $validated);
3237
}
3338
}
3439
return $this;
3540
}
3641

42+
public function resetApply(array $validated)
43+
{
44+
$this->builder = clone $this->realBuilder;
45+
return $this->apply($validated);
46+
}
47+
3748
public function query()
3849
{
3950
return $this->builder;

src/Providers/LaravelQueryFilterServiceProvider.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Oooiik\LaravelQueryFilter\Providers;
44

5-
use Oooiik\LaravelQueryFilter\Console\MakeQueryFilter;
5+
use Oooiik\LaravelQueryFilter\Console\MakeFilter;
66

77
class LaravelQueryFilterServiceProvider extends \Illuminate\Support\ServiceProvider
88
{
@@ -15,7 +15,7 @@ public function boot()
1515
{
1616
if ($this->app->runningInConsole()) {
1717
$this->commands([
18-
MakeQueryFilter::class,
18+
MakeFilter::class,
1919
]);
2020
}
2121
}

src/Traits/Model/Filterable.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Oooiik\LaravelQueryFilter\Traits\Model;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Oooiik\LaravelQueryFilter\Filters\QueryFilter;
7+
use Symfony\Component\ErrorHandler\Error\ClassNotFoundError;
8+
9+
/**
10+
* @method static Builder filter(string $filter, array $validated = [])
11+
*/
12+
trait Filterable
13+
{
14+
public function scopeFilter(Builder $query, $filter, array $validated = [])
15+
{
16+
if (!class_exists($filter)) {
17+
throw new ClassNotFoundError('Class not found', 500);
18+
}
19+
if (!is_subclass_of($filter, QueryFilter::class)) {
20+
throw new ClassNotFoundError('It is not a successor class of Filter', 500);
21+
}
22+
return $filter::builder($query)->apply($validated)->query();
23+
}
24+
25+
/**
26+
* @param string $filter
27+
* @return QueryFilter
28+
*/
29+
public static function createFilter($filter)
30+
{
31+
if (!class_exists($filter)) {
32+
throw new ClassNotFoundError('Class not found', 500);
33+
}
34+
if (!is_subclass_of($filter, QueryFilter::class)) {
35+
throw new ClassNotFoundError('It is not a successor class of Filter', 500);
36+
}
37+
$query = self::query();
38+
return $filter::builder($query);
39+
}
40+
}

src/Traits/Model/QueryFilter.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)