From c956c7b49c354cc4a04783c5e7bc4053ced245d0 Mon Sep 17 00:00:00 2001 From: Brent Roose Date: Tue, 12 Jun 2018 14:42:53 +0200 Subject: [PATCH 1/3] Allow for instantiated custom filters --- src/Filter.php | 16 +++++++++++++--- tests/FilterTest.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Filter.php b/src/Filter.php index 168e52cb..4ac67a33 100644 --- a/src/Filter.php +++ b/src/Filter.php @@ -3,6 +3,7 @@ namespace Spatie\QueryBuilder; use Illuminate\Database\Eloquent\Builder; +use Spatie\QueryBuilder\Filters\Filter as CustomFilter; use Spatie\QueryBuilder\Filters\FiltersExact; use Spatie\QueryBuilder\Filters\FiltersScope; use Spatie\QueryBuilder\Filters\FiltersPartial; @@ -15,7 +16,7 @@ class Filter /** @var string */ protected $property; - public function __construct(string $property, string $filterClass) + public function __construct(string $property, $filterClass) { $this->property = $property; $this->filterClass = $filterClass; @@ -23,7 +24,7 @@ public function __construct(string $property, string $filterClass) public function filter(Builder $builder, $value) { - $filterClass = new $this->filterClass; + $filterClass = $this->resolveFilterClass(); ($filterClass)($builder, $value, $this->property); } @@ -43,7 +44,7 @@ public static function scope(string $property) : self return new static($property, FiltersScope::class); } - public static function custom(string $property, string $filterClass) : self + public static function custom(string $property, $filterClass) : self { return new static($property, $filterClass); } @@ -57,4 +58,13 @@ public function isForProperty(string $property): bool { return $this->property === $property; } + + private function resolveFilterClass(): CustomFilter + { + if ($this->filterClass instanceof CustomFilter) { + return $this->filterClass; + } + + return new $this->filterClass; + } } diff --git a/tests/FilterTest.php b/tests/FilterTest.php index a98ce778..a33691c0 100644 --- a/tests/FilterTest.php +++ b/tests/FilterTest.php @@ -5,6 +5,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Spatie\QueryBuilder\Filter; +use Spatie\QueryBuilder\Filters\Filter as CustomFilter; use Spatie\QueryBuilder\QueryBuilder; use Illuminate\Database\Eloquent\Builder; use Spatie\QueryBuilder\Tests\Models\TestModel; @@ -238,6 +239,36 @@ public function it_guards_against_invalid_filters() ->allowedFilters('id'); } + /** @test */ + public function it_can_create_a_custom_filter_with_an_instantiated_filter() + { + $customFilter = new class('test1') implements CustomFilter { + /** @var string */ + private $filter; + + public function __construct(string $filter) + { + $this->filter = $filter; + } + + public function __invoke(Builder $query, $value, string $property): Builder + { + return $query; + } + }; + + TestModel::create(['name' => 'abcdef']); + + $results = $this + ->createQueryFromFilterRequest([ + '*' => '*' + ]) + ->allowedFilters('name', Filter::custom('*', $customFilter)) + ->get(); + + $this->assertNotEmpty($results); + } + /** @test */ public function an_invalid_filter_query_exception_contains_the_unknown_and_allowed_filters() { From 0d9fcab017d64ea314dc385c6cd22977227dc799 Mon Sep 17 00:00:00 2001 From: Brent Roose Date: Tue, 12 Jun 2018 12:43:28 +0000 Subject: [PATCH 2/3] Apply fixes from StyleCI --- src/Filter.php | 2 +- tests/FilterTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Filter.php b/src/Filter.php index 4ac67a33..5f5ad8e9 100644 --- a/src/Filter.php +++ b/src/Filter.php @@ -3,10 +3,10 @@ namespace Spatie\QueryBuilder; use Illuminate\Database\Eloquent\Builder; -use Spatie\QueryBuilder\Filters\Filter as CustomFilter; use Spatie\QueryBuilder\Filters\FiltersExact; use Spatie\QueryBuilder\Filters\FiltersScope; use Spatie\QueryBuilder\Filters\FiltersPartial; +use Spatie\QueryBuilder\Filters\Filter as CustomFilter; class Filter { diff --git a/tests/FilterTest.php b/tests/FilterTest.php index a33691c0..492e28c8 100644 --- a/tests/FilterTest.php +++ b/tests/FilterTest.php @@ -5,11 +5,11 @@ use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Spatie\QueryBuilder\Filter; -use Spatie\QueryBuilder\Filters\Filter as CustomFilter; use Spatie\QueryBuilder\QueryBuilder; use Illuminate\Database\Eloquent\Builder; use Spatie\QueryBuilder\Tests\Models\TestModel; use Spatie\QueryBuilder\Exceptions\InvalidFilterQuery; +use Spatie\QueryBuilder\Filters\Filter as CustomFilter; use Spatie\QueryBuilder\Filters\Filter as FilterInterface; class FilterTest extends TestCase @@ -261,7 +261,7 @@ public function __invoke(Builder $query, $value, string $property): Builder $results = $this ->createQueryFromFilterRequest([ - '*' => '*' + '*' => '*', ]) ->allowedFilters('name', Filter::custom('*', $customFilter)) ->get(); From c2bb23b294d8213af13ea751a0f19ddfd140f623 Mon Sep 17 00:00:00 2001 From: Brent Roose Date: Tue, 12 Jun 2018 14:55:52 +0200 Subject: [PATCH 3/3] Update README --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd46935c..80645aee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to `laravel-query-builder` will be documented in this file +## 1.10.0 - 2018-06-12 + +- add support for instantiated custom filter classes + ## 1.9.6 - 2018-06-11 - fix for using reserved SQL words as attributes in Postgres