From 3f93b8fd58a470b9fe0032be6af611a57fc24a2c Mon Sep 17 00:00:00 2001 From: oooiik Date: Thu, 27 Oct 2022 17:43:05 +0500 Subject: [PATCH] add createFilter --- .../{MakeQueryFilter.php => MakeFilter.php} | 58 +++++++------------ .../stubs/{query-filter.stub => filter.stub} | 2 +- src/{QueryFilter => Filters}/QueryFilter.php | 23 ++++++-- .../LaravelQueryFilterServiceProvider.php | 4 +- src/Traits/Model/Filterable.php | 40 +++++++++++++ src/Traits/Model/QueryFilter.php | 22 ------- 6 files changed, 80 insertions(+), 69 deletions(-) rename src/Console/{MakeQueryFilter.php => MakeFilter.php} (54%) rename src/Console/stubs/{query-filter.stub => filter.stub} (60%) rename src/{QueryFilter => Filters}/QueryFilter.php (56%) create mode 100644 src/Traits/Model/Filterable.php delete mode 100644 src/Traits/Model/QueryFilter.php diff --git a/src/Console/MakeQueryFilter.php b/src/Console/MakeFilter.php similarity index 54% rename from src/Console/MakeQueryFilter.php rename to src/Console/MakeFilter.php index 6b436cc..40dee24 100644 --- a/src/Console/MakeQueryFilter.php +++ b/src/Console/MakeFilter.php @@ -6,7 +6,7 @@ use Illuminate\Filesystem\Filesystem; use Symfony\Component\Console\Exception\InvalidArgumentException; -class MakeQueryFilter extends Command +class MakeFilter extends Command { /** * The filesystem instance. @@ -14,9 +14,11 @@ class MakeQueryFilter extends Command * @var Filesystem */ protected $files; - protected $modelName; - protected $signature = 'make:query-filter {model}'; + /** @var string $className */ + protected $className; + + protected $signature = 'make:filter {name}'; protected $description = 'Create a new query filter class'; @@ -29,11 +31,18 @@ public function __construct(Filesystem $files) public function handle() { - $model = $this->argument('model'); - $this->setModelName($model); + $name = $this->argument('name'); + $this->setFilterName($name); $this->buildClass(); } + public function setFilterName($name){ + $class = '\\App\\Filters\\' . $name; + if (class_exists($class)) { + throw new InvalidArgumentException('Class exists!'); + } + $this->className = $name; + } protected function buildClass() { @@ -48,57 +57,30 @@ protected function buildClass() protected function getGenerationPath() { - return app_path('Filters/Query/' . $this->getGenerationClassName() . '.php'); + return app_path('Filters/' . $this->className . '.php'); } protected function getGenerationDir() { - return app_path('Filters/Query'); - } - - protected function getGenerationClassName() - { - return $this->modelName . 'QueryFilter'; - } - - protected function hasModel($model) - { - return class_exists($model); - } - - protected function setModelName($model) - { - $modelClass = '\\App\\Models\\' . $model; - if (!$this->hasModel($modelClass)) { - throw new InvalidArgumentException('Model not found!'); - } - $this->modelName = class_basename($model); + return app_path('Filters'); } protected function replaceStub() { - $stub = str_replace( + return str_replace( ['{{ namespace }}', '{{ class }}'], - [$this->getNamespace(), $this->getClassName()], + [$this->getNamespace(), $this->className], $this->getStub() ); - - return $stub; } protected function getStub() { - return $this->files->get(__DIR__ . '/stubs/query-filter.stub'); + return $this->files->get(__DIR__ . '/stubs/filter.stub'); } protected function getNamespace() { - return 'App\Filters\Query'; + return 'App\Filters'; } - - protected function getClassName() - { - return $this->modelName . 'QueryFilter'; - } - } diff --git a/src/Console/stubs/query-filter.stub b/src/Console/stubs/filter.stub similarity index 60% rename from src/Console/stubs/query-filter.stub rename to src/Console/stubs/filter.stub index 0193805..e0a82f7 100644 --- a/src/Console/stubs/query-filter.stub +++ b/src/Console/stubs/filter.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use Oooiik\LaravelQueryFilter\QueryFilter\QueryFilter; +use Oooiik\LaravelQueryFilter\Filters\QueryFilter; class {{ class }} extends QueryFilter { diff --git a/src/QueryFilter/QueryFilter.php b/src/Filters/QueryFilter.php similarity index 56% rename from src/QueryFilter/QueryFilter.php rename to src/Filters/QueryFilter.php index 5616942..ad9208b 100644 --- a/src/QueryFilter/QueryFilter.php +++ b/src/Filters/QueryFilter.php @@ -1,6 +1,6 @@ builder = $builder; + $this->realBuilder = $builder; + $this->builder = clone $this->realBuilder; } public static function builder(Builder $builder) @@ -19,21 +22,29 @@ public static function builder(Builder $builder) return new static($builder); } - public function filters(){ + public function filters() + { $staticClassMethods = get_class_methods(static::class); $selfClassMethods = get_class_methods(self::class); return array_diff($staticClassMethods, $selfClassMethods); } - public function apply(array $validated){ - foreach ($this->filters() as $filter){ - if(in_array($filter, array_keys($validated))){ + public function apply(array $validated) + { + foreach ($this->filters() as $filter) { + if (in_array($filter, array_keys($validated))) { $this->$filter($validated[$filter], $validated); } } return $this; } + public function resetApply(array $validated) + { + $this->builder = clone $this->realBuilder; + return $this->apply($validated); + } + public function query() { return $this->builder; diff --git a/src/Providers/LaravelQueryFilterServiceProvider.php b/src/Providers/LaravelQueryFilterServiceProvider.php index 59486c9..4edfb48 100644 --- a/src/Providers/LaravelQueryFilterServiceProvider.php +++ b/src/Providers/LaravelQueryFilterServiceProvider.php @@ -2,7 +2,7 @@ namespace Oooiik\LaravelQueryFilter\Providers; -use Oooiik\LaravelQueryFilter\Console\MakeQueryFilter; +use Oooiik\LaravelQueryFilter\Console\MakeFilter; class LaravelQueryFilterServiceProvider extends \Illuminate\Support\ServiceProvider { @@ -15,7 +15,7 @@ public function boot() { if ($this->app->runningInConsole()) { $this->commands([ - MakeQueryFilter::class, + MakeFilter::class, ]); } } diff --git a/src/Traits/Model/Filterable.php b/src/Traits/Model/Filterable.php new file mode 100644 index 0000000..cd9fec7 --- /dev/null +++ b/src/Traits/Model/Filterable.php @@ -0,0 +1,40 @@ +apply($validated)->query(); + } + + /** + * @param string $filter + * @return QueryFilter + */ + public static function createFilter($filter) + { + if (!class_exists($filter)) { + throw new ClassNotFoundError('Class not found', 500); + } + if (!is_subclass_of($filter, QueryFilter::class)) { + throw new ClassNotFoundError('It is not a successor class of Filter', 500); + } + $query = self::query(); + return $filter::builder($query); + } +} diff --git a/src/Traits/Model/QueryFilter.php b/src/Traits/Model/QueryFilter.php deleted file mode 100644 index 22cb56b..0000000 --- a/src/Traits/Model/QueryFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -apply($validated)->query(); - } else { - return $query; - } - } -}