Completed
Push — master ( aa8a20...a28f74 )
by Andrea Marco
04:56 queued 12s
created

QueryFilters::getRules()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Cerbero\QueryFilters;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Arr;
8
use Illuminate\Support\Facades\Validator;
9
use Illuminate\Support\Str;
10
use ReflectionMethod;
11
12
/**
13
 * Abstract implementation of a query filters class.
14
 *
15
 */
16
abstract class QueryFilters
17
{
18
    /**
19
     * The HTTP request with query parameters.
20
     *
21
     * @var \Illuminate\Http\Request
22
     */
23
    protected $request;
24
25
    /**
26
     * The Eloquent query builder.
27
     *
28
     * @var \Illuminate\Database\Eloquent\Builder
29
     */
30
    protected $query;
31
32
    /**
33
     * Set the dependencies.
34
     *
35
     * @param \Illuminate\Http\Request $request
36
     */
37 18
    public function __construct(Request $request)
38
    {
39 18
        $this->request = $request;
40 18
    }
41
42
    /**
43
     * Retrieve the request that query filters are based on
44
     *
45
     * @return \Illuminate\Http\Request
46
     */
47 3
    public function getRequest()
48
    {
49 3
        return $this->request;
50
    }
51
52
    /**
53
     * Hydrate query filters from a plain array.
54
     *
55
     * @param array $queries
56
     * @return static
57
     */
58 6
    public static function hydrate(array $queries)
59
    {
60 6
        $request = new Request($queries);
61
62 6
        return new static($request);
63
    }
64
65
    /**
66
     * Apply filters based on query parameters.
67
     *
68
     * @param \Illuminate\Database\Eloquent\Builder $query
69
     * @return \Illuminate\Database\Eloquent\Builder
70
     */
71 15
    public function applyToQuery(Builder $query)
72
    {
73 15
        $this->query = $query;
74
75 15
        foreach ($this->request->all() as $filter => $value) {
76 15
            if ($this->filterCanBeApplied($filter, $value)) {
77 15
                call_user_func([$this, Str::camel($filter)], $value);
78
            }
79
        }
80
81 15
        return $query;
82
    }
83
84
    /**
85
     * Determine whether the given filter can be applied with the provided value.
86
     *
87
     * @param string $filter
88
     * @param mixed $value
89
     * @return boolean
90
     */
91 15
    protected function filterCanBeApplied($filter, $value)
92
    {
93 15
        $method = Str::camel($filter);
94
95
        // do not apply query filters that haven't been implemented
96 15
        if (!method_exists($this, $method)) {
97 3
            return false;
98
        }
99
100
        // apply query filters with valid values
101 15
        if ($value !== '' && $value !== null) {
102 12
            $data = $this->request->only($filter);
103 12
            $rules = Arr::only($this->getRules(), $filter);
104
105 12
            return !Validator::make($data, $rules)->fails();
106
        }
107
108
        // apply query filters that don't need values (implicit filters)
109 15
        return (new ReflectionMethod($this, $method))->getNumberOfParameters() === 0;
110
    }
111
112
    /**
113
     * Retrieve the rules to validate filters value.
114
     * If a filter validation fails, the filter is not applied.
115
     *
116
     * @return array
117
     */
118 9
    protected function getRules()
119
    {
120 9
        return [];
121
    }
122
}
123