SearchCriteria   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
dl 0
loc 107
rs 10
c 0
b 0
f 0
wmc 8
lcom 1
cbo 7

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A paginate() 0 12 1
A get() 0 4 1
A first() 0 4 1
A __get() 0 4 1
A __call() 0 10 2
A __toString() 0 4 1
1
<?php namespace Anomaly\Streams\Platform\Search;
2
3
use Anomaly\Streams\Platform\Traits\Hookable;
4
use Anomaly\Streams\Platform\Support\Decorator;
5
use Anomaly\Streams\Platform\Support\Presenter;
6
use Anomaly\Streams\Platform\Support\Collection;
7
use Anomaly\Streams\Platform\Model\EloquentModel;
8
use Illuminate\Pagination\Paginator;
9
use Laravel\Scout\Builder;
10
11
class SearchCriteria
12
{
13
    use Hookable;
14
15
    /**
16
     * The search builder.
17
     *
18
     * @var Builder
19
     */
20
    protected $query;
21
22
    /**
23
     * The model object.
24
     *
25
     * @var EloquentModel
26
     */
27
    protected $model;
28
29
    /**
30
     * Create a new SearchCriteria instance.
31
     *
32
     * @param Builder       $query
33
     * @param EloquentModel $model
34
     */
35
    public function __construct(Builder $query, EloquentModel $model)
36
    {
37
        $this->query  = $query;
38
        $this->model  = $model;
39
    }
40
41
    /**
42
     * Get the paginated entries.
43
     *
44
     * @return Collection
45
     */
46
    public function paginate($perPage = 15, $pageName = 'page', $page = null)
47
    {
48
        $paginator = $this->query->paginate($perPage, $pageName, $page);
49
50
        $data = $paginator->toArray();
51
52
        return new Paginator(
53
            (new Decorator())->decorate($this->model->newCollection($paginator->items())),
54
            $data['per_page'],
55
            $data['current_page']
56
        );
57
    }
58
59
    /**
60
     * Get the entries.
61
     *
62
     * @return Collection
63
     */
64
    public function get()
65
    {
66
        return (new Decorator())->decorate($this->model->newCollection($this->query->get()->all()));
0 ignored issues
show
Bug Best Practice introduced by
The return type of return (new \Anomaly\Str...>query->get()->all())); (object|integer|double|string|null|boolean|array) is incompatible with the return type documented by Anomaly\Streams\Platform...rch\SearchCriteria::get of type Anomaly\Streams\Platform\Support\Collection|null.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
67
    }
68
69
    /**
70
     * Get the first entry.
71
     *
72
     * @return Presenter
73
     */
74
    public function first()
75
    {
76
        return (new Decorator())->decorate($this->query->first());
0 ignored issues
show
Bug Best Practice introduced by
The return type of return (new \Anomaly\Str...$this->query->first()); (object|integer|double|string|null|boolean|array) is incompatible with the return type documented by Anomaly\Streams\Platform...h\SearchCriteria::first of type Anomaly\Streams\Platform\Support\Presenter|null.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
77
    }
78
79
    /**
80
     * Route through __call.
81
     *
82
     * @param $name
83
     * @return Builder|null
84
     */
85
    public function __get($name)
86
    {
87
        return $this->__call($name, []);
88
    }
89
90
    /**
91
     * Call the method on the query.
92
     *
93
     * @param $name
94
     * @param $arguments
95
     * @return Builder|null
96
     */
97
    public function __call($name, $arguments)
98
    {
99
        if ($this->hasHook($name)) {
100
            return $this->call($name, $arguments);
101
        }
102
103
        call_user_func_array([$this->query, $name], $arguments);
104
105
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this; (Anomaly\Streams\Platform\Search\SearchCriteria) is incompatible with the return type documented by Anomaly\Streams\Platform...\SearchCriteria::__call of type Laravel\Scout\Builder|null.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
106
    }
107
108
    /**
109
     * Return the string.
110
     *
111
     * @return string
112
     */
113
    public function __toString()
114
    {
115
        return '';
116
    }
117
}
118