Completed
Pull Request — master (#90)
by Arnaud
03:24
created

RequestParametersExtractor   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 149
Duplicated Lines 4.7 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 17
lcom 1
cbo 3
dl 7
loc 149
ccs 0
cts 84
cp 0
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A extract() 0 16 1
A getCriteriaValues() 7 15 3
A getOrderValues() 0 17 4
A getPaginationValues() 0 21 4
B getFilterValues() 0 32 5

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace LAG\AdminBundle\Admin\Request\Extractor;
4
5
use LAG\AdminBundle\Action\Configuration\ActionConfiguration;
6
use LAG\AdminBundle\Admin\AdminInterface;
7
use Symfony\Component\Form\FormInterface;
8
use Symfony\Component\HttpFoundation\Request;
9
10
class RequestParametersExtractor
11
{
12
    /**
13
     * Extract parameters for the load method from the Request.
14
     *
15
     * @param Request             $request
16
     * @param ActionConfiguration $configuration
17
     * @param FormInterface|null  $form
18
     *
19
     * @return array
20
     */
21
    public function extract(Request $request, ActionConfiguration $configuration, FormInterface $form = null)
22
    {
23
        $criteria = $this->getCriteriaValues($request, $configuration);
24
        $pagination = $this->getPaginationValues($request, $configuration);
25
        $orders = $this->getOrderValues($request, $configuration);
26
        $filters = $this->getFilterValues($request, $form);
27
        $criteria = array_merge($criteria, $filters['filters']);
28
    
29
        return [
30
            'criteria' => $criteria,
31
            'order' => $orders,
32
            'maxPerPage' => $pagination['maxPerPage'],
33
            'page' => $pagination['page'],
34
            'filterOptions' => $filters['filterOptions'],
35
        ];
36
    }
37
    
38
    /**
39
     * Get the criteria values.
40
     *
41
     * @param Request             $request
42
     * @param ActionConfiguration $configuration
43
     *
44
     * @return array
45
     */
46
    private function getCriteriaValues(Request $request, ActionConfiguration $configuration)
47
    {
48
        $values = [];
49
        $criteriaConfiguration = $configuration->getParameter('criteria');
50
    
51 View Code Duplication
        foreach ($criteriaConfiguration as $criterion) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
52
            $value = $request->get($criterion);
53
    
54
            if (null !== $value) {
55
                $values[$criterion] = $value;
56
            }
57
        }
58
        
59
        return $values;
60
    }
61
    
62
    /**
63
     * Get the sort and order values.
64
     *
65
     * @param Request             $request
66
     * @param ActionConfiguration $configuration
67
     *
68
     * @return array
69
     */
70
    private function getOrderValues(Request $request, ActionConfiguration $configuration)
71
    {
72
        if (true !== $configuration->getParameter('sortable')) {
73
            return [];
74
        }
75
        $values = [];
76
    
77
        if (null !== $request->get('sort')) {
78
            $values['sort'] = $request->get('sort');
79
        }
80
    
81
        if (null !== $request->get('order')) {
82
            $values['order'] = $request->get('order');
83
        }
84
    
85
        return $values;
86
    }
87
    
88
    /**
89
     * Get the pagination values.
90
     *
91
     * @param Request             $request
92
     * @param ActionConfiguration $configuration
93
     *
94
     * @return array
95
     */
96
    private function getPaginationValues(Request $request, ActionConfiguration $configuration)
97
    {
98
        $pagination = [
99
            'page' => null,
100
            'maxPerPage' => $configuration->getParameter('max_per_page'),
101
        ];
102
        // the pagination is required if the load strategy is multiple and the pagerfanta is configured
103
        $isPaginationRequired = AdminInterface::LOAD_STRATEGY_MULTIPLE === $configuration->getParameter('load_strategy')
104
            && 'pagerfanta' === $configuration->getParameter('pager');
105
    
106
        if ($isPaginationRequired) {
107
            // retrieve the page parameter value
108
            $pagination['page'] = $request->get('page', 1);
109
        }
110
    
111
        if (null !== $request->get('maxPerPage')) {
112
            $pagination['maxPerPage'] = $request->get('maxPerPage');
113
        }
114
    
115
        return $pagination;
116
    }
117
    
118
    /**
119
     * Handle the value of the filter form.
120
     *
121
     * @param Request            $request
122
     * @param FormInterface|null $form
123
     *
124
     * @return array|mixed
125
     */
126
    private function getFilterValues(Request $request, FormInterface $form = null)
127
    {
128
        // if no filter form was provided, nothing to do
129
        if (null === $form) {
130
            return [
131
                'filters' => [],
132
                'filterOptions' => [],
133
            ];
134
        }
135
        $filters = [];
136
        $filtersOptions = [];
137
        $form->handleRequest($request);
138
        
139
        if ($form->isValid()) {
140
            
141
            foreach ($form->getData() as $filter => $value) {
142
    
143
                if (null === $value) {
144
                    continue;
145
                }
146
                $filters[$filter] = $value;
147
                $filtersOptions[$filter] = [
148
                    'operator' => 'LIKE',
149
                ];
150
            }
151
        }
152
        
153
        return [
154
            'filters' => $filters,
155
            'filterOptions' => $filtersOptions,
156
        ];
157
    }
158
}
159