Skip to content

Commit

Permalink
add createFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
oooiik committed Oct 27, 2022
1 parent 0881bf7 commit 3f93b8f
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 69 deletions.
58 changes: 20 additions & 38 deletions src/Console/MakeQueryFilter.php → src/Console/MakeFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,19 @@
use Illuminate\Filesystem\Filesystem;
use Symfony\Component\Console\Exception\InvalidArgumentException;

class MakeQueryFilter extends Command
class MakeFilter extends Command
{
/**
* The filesystem instance.
*
* @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';

Expand All @@ -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()
{
Expand All @@ -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';
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace {{ namespace }};

use Oooiik\LaravelQueryFilter\QueryFilter\QueryFilter;
use Oooiik\LaravelQueryFilter\Filters\QueryFilter;

class {{ class }} extends QueryFilter
{
Expand Down
23 changes: 17 additions & 6 deletions src/QueryFilter/QueryFilter.php → src/Filters/QueryFilter.php
Original file line number Diff line number Diff line change
@@ -1,39 +1,50 @@
<?php

namespace Oooiik\LaravelQueryFilter\QueryFilter;
namespace Oooiik\LaravelQueryFilter\Filters;

use Illuminate\Database\Eloquent\Builder;

abstract class QueryFilter
{
/** @var Builder */
protected $builder;
/** @var Builder */
protected $realBuilder;

public function __construct(Builder $builder)
{
$this->builder = $builder;
$this->realBuilder = $builder;
$this->builder = clone $this->realBuilder;
}

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;
Expand Down
4 changes: 2 additions & 2 deletions src/Providers/LaravelQueryFilterServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Oooiik\LaravelQueryFilter\Providers;

use Oooiik\LaravelQueryFilter\Console\MakeQueryFilter;
use Oooiik\LaravelQueryFilter\Console\MakeFilter;

class LaravelQueryFilterServiceProvider extends \Illuminate\Support\ServiceProvider
{
Expand All @@ -15,7 +15,7 @@ public function boot()
{
if ($this->app->runningInConsole()) {
$this->commands([
MakeQueryFilter::class,
MakeFilter::class,
]);
}
}
Expand Down
40 changes: 40 additions & 0 deletions src/Traits/Model/Filterable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Oooiik\LaravelQueryFilter\Traits\Model;

use Illuminate\Database\Eloquent\Builder;
use Oooiik\LaravelQueryFilter\Filters\QueryFilter;
use Symfony\Component\ErrorHandler\Error\ClassNotFoundError;

/**
* @method static Builder filter(string $filter, array $validated = [])
*/
trait Filterable
{
public function scopeFilter(Builder $query, $filter, array $validated = [])
{
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);
}
return $filter::builder($query)->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);
}
}
22 changes: 0 additions & 22 deletions src/Traits/Model/QueryFilter.php

This file was deleted.

0 comments on commit 3f93b8f

Please sign in to comment.