Skip to content

Commit 32d8eac

Browse files
committed
Optimization
1 parent 22128a7 commit 32d8eac

10 files changed

+96
-54
lines changed

readme.md

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,15 @@ OldPeopleFilter.php
8282
declare(strict_types=1);
8383

8484
use Illuminate\Database\Query\Builder;
85+
use DevMakerLab\LaravelFilters\AbstractFilter;
8586

86-
class OldPeopleFilter implements FilterInterface
87+
class OldPeopleFilter extends AbstractFilter
8788
{
88-
public static function neededKeys(): array
89-
{
90-
return ['age'];
91-
}
92-
93-
public static function isApplicable(...$args): bool
94-
{
95-
return true;
96-
}
89+
public int $age;
9790

98-
public function apply(Builder &$queryBuilder, ...$args): void
91+
public function apply(Builder &$queryBuilder): void
9992
{
100-
$age = $args[0][self::neededKeys()[0]];
101-
102-
$queryBuilder->where('age', '>=', $age);
93+
$queryBuilder->where('age', '>=', $this->age);
10394
}
10495
}
10596
```

src/AbstractFilter.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DevMakerLab\LaravelFilters;
6+
7+
use Illuminate\Database\Query\Builder;
8+
9+
abstract class AbstractFilter
10+
{
11+
public function __construct(array $args = [])
12+
{
13+
$this->setAttributes($args);
14+
}
15+
16+
protected function setAttributes(array $attributes): void
17+
{
18+
foreach (get_class_vars(static::class) as $key => $value) {
19+
if (isset($attributes[$key])) {
20+
$this->$key = $attributes[$key];
21+
}
22+
}
23+
}
24+
25+
public static function isApplicable(... $args): bool
26+
{
27+
return true;
28+
}
29+
30+
/**
31+
* @throws NoApplyFilterRuleException
32+
*/
33+
public function apply(Builder &$queryBuilder): void
34+
{
35+
throw new NoApplyFilterRuleException(self::class);
36+
}
37+
}

src/AbstractFilterableRepository.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function addFilter(string $filter): self
2222
throw new FilterClassNotFound();
2323
}
2424

25-
if (! is_subclass_of($filter, FilterInterface::class)) {
25+
if (! is_subclass_of($filter, AbstractFilter::class)) {
2626
throw new IncorrectFilterException($filter);
2727
}
2828

@@ -55,11 +55,11 @@ public function resetLimit(): self
5555
public function applyFilters(Builder &$builder, array $args): self
5656
{
5757
foreach ($this->filters as $filter) {
58-
$neededKeys = $filter::neededKeys();
59-
$neededArgs = $this->extractNeededArgs($neededKeys, $args);
58+
$neededArgs = $this->extractNeededArgs($filter, $args);
6059

6160
if ($filter::isApplicable($neededArgs)) {
62-
(new $filter)->apply($builder, $neededArgs);
61+
$filterInstance = new $filter($neededArgs);
62+
$filterInstance->apply($builder);
6363
}
6464
}
6565

@@ -73,8 +73,8 @@ public function applyFilters(Builder &$builder, array $args): self
7373
return $this;
7474
}
7575

76-
private function extractNeededArgs(array $neededKeys, array $args): array
76+
private function extractNeededArgs(string $class, array $args): array
7777
{
78-
return array_intersect_key($args, array_flip($neededKeys));
78+
return array_intersect_key($args, array_flip(array_keys(get_class_vars($class))));
7979
}
8080
}

src/FilterInterface.php

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

src/IncorrectFilterException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ class IncorrectFilterException extends Exception
1010
{
1111
public function __construct(string $class)
1212
{
13-
parent::__construct(sprintf('Class `%s` does not extends FilterInterface.', $class));
13+
parent::__construct(sprintf('Class `%s` does not extends AbstractFilter.', $class));
1414
}
1515
}

src/NoApplyFilterRuleException.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DevMakerLab\LaravelFilters;
6+
7+
use Exception;
8+
9+
class NoApplyFilterRuleException extends Exception
10+
{
11+
public function __construct(string $class)
12+
{
13+
parent::__construct(sprintf('Filter class `%s` has no apply function.', $class));
14+
}
15+
}

tests/Example/Filters/OldPeopleFilter.php

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,14 @@
55
namespace Tests\Example\Filters;
66

77
use Illuminate\Database\Query\Builder;
8-
use DevMakerLab\LaravelFilters\FilterInterface;
8+
use DevMakerLab\LaravelFilters\AbstractFilter;
99

10-
class OldPeopleFilter implements FilterInterface
10+
class OldPeopleFilter extends AbstractFilter
1111
{
12-
public static function neededKeys(): array
13-
{
14-
return ['age'];
15-
}
16-
17-
public static function isApplicable(...$args): bool
18-
{
19-
return true;
20-
}
12+
public int $age;
2113

22-
public function apply(Builder &$queryBuilder, ...$args): void
14+
public function apply(Builder &$queryBuilder): void
2315
{
24-
$age = $args[0][self::neededKeys()[0]];
25-
26-
$queryBuilder->where('age', '>=', $age);
16+
$queryBuilder->where('age', '>=', $this->age);
2717
}
2818
}

tests/Example/PeopleRepository.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Tests\Example;
66

7+
use Tests\Example\Entities\PeopleEntity;
78
use Tests\Example\Entities\PeopleEntityList;
89
use DevMakerLab\LaravelFilters\AbstractFilterableRepository;
910

@@ -31,11 +32,11 @@ public function get(array $args): PeopleEntityList
3132
public function transform(\Illuminate\Support\Collection $people): PeopleEntityList
3233
{
3334
$people->transform(function ($person) {
34-
return [
35+
return new PeopleEntity([
3536
'name' => sprintf('%s %s', $person->lastname, $person->firstname),
3637
'age' => $person->age,
3738
'gender' => $person->gender,
38-
];
39+
]);
3940
});
4041

4142
return new PeopleEntityList($people->toArray());

tests/Feature/AbstractFilterableRepositoryTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,28 @@ public function can_get_old_people()
2020
{
2121
$peopleRepository = $this->instantiatePeopleRepository();
2222

23+
$this->createPeople([
24+
[
25+
'firstname' => 'Snoop',
26+
'lastname' => 'Dogg',
27+
'gender' => 'male',
28+
'age' => 49,
29+
],
30+
[
31+
'firstname' => 'Danielle',
32+
'lastname' => 'Studio',
33+
'gender' => 'female',
34+
'age' => 67,
35+
]
36+
]);
37+
2338
$people = $peopleRepository
2439
->addFilter(OldPeopleFilter::class)
2540
->get(['age' => 60]);
2641

2742
$this->assertInstanceOf(PeopleEntityList::class, $people);
43+
$this->assertCount(1, $people);
44+
$this->assertInstanceOf(\Tests\Example\Entities\PeopleEntity::class, $people[0]);
2845
}
2946
}
3047

tests/TestCase.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,11 @@ public function instantiatePeopleRepository(): PeopleRepository
2929
{
3030
return new PeopleRepository($this->app['db']);
3131
}
32+
33+
public function createPeople(array $peoples)
34+
{
35+
$this->app['db']
36+
->table('people')
37+
->insert($peoples);
38+
}
3239
}

0 commit comments

Comments
 (0)