Completed
Push — master ( ce37f0...8d1c08 )
by Andrea Marco
05:00 queued 12s
created

QueryFilters::getRequest()   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\Str;
8
use ReflectionMethod;
9
10
/**
11
 * Abstract implementation of a query filters class.
12
 *
13
 */
14
abstract class QueryFilters
15
{
16
    /**
17
     * The HTTP request with query parameters.
18
     *
19
     * @var \Illuminate\Http\Request
20
     */
21
    protected $request;
22
23
    /**
24
     * The Eloquent query builder.
25
     *
26
     * @var \Illuminate\Database\Eloquent\Builder
27
     */
28
    protected $query;
29
30
    /**
31
     * Set the dependencies.
32
     *
33
     * @param \Illuminate\Http\Request $request
34
     */
35 15
    public function __construct(Request $request)
36
    {
37 15
        $this->request = $request;
38 15
    }
39
40
    /**
41
     * Retrieve the request that query filters are based on
42
     *
43
     * @return \Illuminate\Http\Request
44
     */
45 3
    public function getRequest()
46
    {
47 3
        return $this->request;
48
    }
49
50
    /**
51
     * Hydrate query filters from a plain array.
52
     *
53
     * @param array $queries
54
     * @return static
55
     */
56 6
    public static function hydrate(array $queries)
57
    {
58 6
        $request = new Request($queries);
59
60 6
        return new static($request);
61
    }
62
63
    /**
64
     * Apply filters based on query parameters.
65
     *
66
     * @param \Illuminate\Database\Eloquent\Builder $query
67
     * @return \Illuminate\Database\Eloquent\Builder
68
     */
69 12
    public function applyToQuery(Builder $query)
70
    {
71 12
        $this->query = $query;
72
73 12
        foreach ($this->request->all() as $filter => $value) {
74 12
            $method = Str::camel($filter);
75
76 12
            if ($this->filterCanBeApplied($method, $value)) {
77 12
                call_user_func([$this, $method], $value);
78 4
            }
79 4
        }
80
81 12
        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 12
    protected function filterCanBeApplied($filter, $value)
92
    {
93
        // do not apply query filters that haven't been implemented
94 12
        if (!method_exists($this, $filter)) {
95 3
            return false;
96
        }
97
98
        // apply query filters with valid values
99 12
        if ($value !== '' && $value !== null) {
100 9
            return true;
101
        }
102
103
        // apply query filters that don't need values (implicit filters)
104 12
        return (new ReflectionMethod($this, $filter))->getNumberOfParameters() === 0;
105
    }
106
}
107