Skip to content

Commit

Permalink
Merge pull request #76 from spatie/allow-instantiated-filters
Browse files Browse the repository at this point in the history
Allow for instantiated custom filters
  • Loading branch information
brendt committed Jun 12, 2018
2 parents 69323ce + c2bb23b commit b1333e2
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 13 additions & 3 deletions src/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Spatie\QueryBuilder\Filters\FiltersExact;
use Spatie\QueryBuilder\Filters\FiltersScope;
use Spatie\QueryBuilder\Filters\FiltersPartial;
use Spatie\QueryBuilder\Filters\Filter as CustomFilter;

class Filter
{
Expand All @@ -15,15 +16,15 @@ 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;
}

public function filter(Builder $builder, $value)
{
$filterClass = new $this->filterClass;
$filterClass = $this->resolveFilterClass();

($filterClass)($builder, $value, $this->property);
}
Expand All @@ -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);
}
Expand All @@ -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;
}
}
31 changes: 31 additions & 0 deletions tests/FilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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
Expand Down Expand Up @@ -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()
{
Expand Down

0 comments on commit b1333e2

Please sign in to comment.