Skip to content

Commit 0525ea7

Browse files
author
Yordi de Kleijn
committed
Initial commit
0 parents  commit 0525ea7

8 files changed

+216
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.idea

composer.json

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "temperworks/laravel-filter-scopes",
3+
"description": "Seperate model filters into reusable scopes that map into the right filters based on URL params.",
4+
"type": "package",
5+
"homepage": "https://github.com/temperworks/laravel-filter-scopes",
6+
"license": "MIT",
7+
"authors": [
8+
{
9+
"name": "Yordi de Kleijn",
10+
"email": "yordi@temper.works",
11+
"homepage": "https://temper.works",
12+
"role": "Developer"
13+
}
14+
],
15+
"require": {
16+
"php" : ">=5.5.0"
17+
},
18+
"require-dev": {
19+
"phpunit/phpunit" : "4.*"
20+
},
21+
"autoload": {
22+
"psr-4": {
23+
"TemperWorks\\FilterScopes\\": "src"
24+
}
25+
},
26+
"extra": {
27+
"laravel": {
28+
"providers": [
29+
30+
]
31+
}
32+
}
33+
}

src/QueryFilters.php

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Database\Eloquent\Builder;
7+
8+
abstract class QueryFilters
9+
{
10+
/**
11+
* The request object.
12+
*
13+
* @var Request
14+
*/
15+
protected $request;
16+
17+
/**
18+
* The builder instance.
19+
*
20+
* @var Builder
21+
*/
22+
protected $builder;
23+
24+
/**
25+
* Create a new QueryFilters instance.
26+
*
27+
* @param Request $request
28+
*/
29+
public function __construct(Request $request)
30+
{
31+
$this->request = $request;
32+
}
33+
34+
/**
35+
* Apply the filters to the builder.
36+
*
37+
* @param Builder $builder
38+
* @return Builder
39+
*/
40+
public function apply(Builder $builder): Builder
41+
{
42+
$this->builder = $builder;
43+
44+
foreach ($this->filters() as $name => $value) {
45+
if (isset($this->lookup)) {
46+
$name = isset($this->lookup[$name]) ? $this->lookup[$name] : $name;
47+
}
48+
49+
if (! method_exists($this, $name)) {
50+
continue;
51+
}
52+
53+
if ($value && strlen($value)) {
54+
$this->$name($value);
55+
} else {
56+
$this->$name();
57+
}
58+
}
59+
60+
return $this->builder;
61+
}
62+
63+
/**
64+
* Get all request filters data.
65+
*
66+
* @return array
67+
*/
68+
public function filters(): array
69+
{
70+
return $this->request->all();
71+
}
72+
73+
public function overrideRequest(Request $request)
74+
{
75+
$this->request = $request;
76+
}
77+
}

src/Traits/Filterable.php

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes\Traits;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use TemperWorks\FilterScopes\QueryFilters;
7+
8+
trait Filterable
9+
{
10+
/**
11+
* Filter a result set.
12+
*
13+
* @param Builder $query
14+
* @param QueryFilters $filters
15+
* @return Builder
16+
*/
17+
public function scopeFilter(Builder $query, QueryFilters $filters): Builder
18+
{
19+
return $filters->apply($query);
20+
}
21+
}

src/Traits/ParseArrayInput.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes\Traits;
4+
5+
trait ParseArrayInput {
6+
7+
public function parseInput($input)
8+
{
9+
return explode(',', $input);
10+
}
11+
}

src/Traits/ParseDateArrayInput.php

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes\Traits;
4+
5+
use Carbon\Carbon;
6+
7+
trait ParseDateArrayInput {
8+
9+
/**
10+
* Parse scope input
11+
*
12+
* @param $input
13+
* @return array
14+
*/
15+
public function parseInput($input)
16+
{
17+
$dates = explode(',', $input);
18+
19+
return array_map(function ($date) {
20+
return Carbon::parse($date)->startOfDay()->toDateString();
21+
}, $dates);
22+
}
23+
}

src/Traits/ValidateArrayInput.php

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes\Traits;
4+
5+
use Validator;
6+
7+
trait ValidateArrayInput {
8+
/**
9+
* Validate given scope input
10+
*
11+
* @param $input
12+
* @param array $extend
13+
* @param string $originalResourceKey
14+
* @return bool
15+
*/
16+
public function validate($input, $extend = [], $originalResourceKey = 'input')
17+
{
18+
$input = [$originalResourceKey => $input];
19+
20+
Validator::make($input, array_merge([
21+
$originalResourceKey => 'array'
22+
], $extend))->validate();
23+
24+
return true;
25+
}
26+
}

src/Traits/ValidateInput.php

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace TemperWorks\FilterScopes\Traits;
4+
5+
use Validator;
6+
7+
trait ValidateInput {
8+
/**
9+
* Validate given scope input
10+
*
11+
* @param $input
12+
* @param array $extend
13+
* @param string $originalResourceKey
14+
* @return bool
15+
*/
16+
public function validate($input, $extend = [], $originalResourceKey = 'input')
17+
{
18+
$input = [$originalResourceKey => $input];
19+
20+
Validator::make($input, $extend)->validate();
21+
22+
return true;
23+
}
24+
}

0 commit comments

Comments
 (0)