Completed
Pull Request — dev (#19)
by Arnaud
02:52
created

ActionConfiguration::configureOptions()   D

Complexity

Conditions 10
Paths 1

Size

Total Lines 135
Code Lines 75

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 59
CRAP Score 10.3042

Importance

Changes 4
Bugs 1 Features 3
Metric Value
c 4
b 1
f 3
dl 0
loc 135
ccs 59
cts 69
cp 0.8551
rs 4.8196
cc 10
eloc 75
nc 1
nop 1
crap 10.3042

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace LAG\AdminBundle\Action\Configuration;
4
5
use LAG\AdminBundle\Admin\AdminInterface;
6
use LAG\AdminBundle\Configuration\Configuration;
7
use Symfony\Component\DependencyInjection\Container;
8
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
9
use Symfony\Component\OptionsResolver\Options;
10
use Symfony\Component\OptionsResolver\OptionsResolver;
11
12
class ActionConfiguration extends Configuration
13
{
14
    /**
15
     * Related Action name.
16
     *
17
     * @var string
18
     */
19
    protected $actionName;
20
21
    /**
22
     * Related Admin (optional)
23
     *
24
     * @var AdminInterface
25
     */
26
    protected $admin = null;
27
28
    /**
29
     * ActionConfiguration constructor.
30
     *
31
     * @param $actionName
32
     * @param AdminInterface $admin
33
     */
34 7
    public function __construct($actionName, AdminInterface $admin)
35
    {
36 7
        parent::__construct();
37
38 7
        $this->actionName = $actionName;
39 7
        $this->admin = $admin;
40 7
    }
41
42
    /**
43
     * Define allowed parameters and values for this configuration, using optionsResolver component.
44
     *
45
     * @param OptionsResolver $resolver
46
     */
47 7
    public function configureOptions(OptionsResolver $resolver)
48
    {
49
        // action title, default to action's name
50
        $resolver
51 7
            ->setDefault('title', Container::camelize($this->actionName))
52 7
            ->setAllowedTypes('title', 'string');
53
54
        // displayed fields for this action
55
        $resolver
56 7
            ->setDefault('fields', [
57 7
                'id' => []
58 7
            ])
59 7
            ->setAllowedTypes('fields', 'array')
60
            ->setNormalizer('fields', function(Options $options, $fields) {
61 7
                $normalizedFields = [];
62
63 7
                foreach ($fields as $name => $field) {
64
65 7
                    if ($field === null) {
66
                        $field = [];
67
                    }
68
69 7
                    $normalizedFields[$name] = $field;
70 7
                }
71
72 7
                return $normalizedFields;
73 7
            })
74
        ;
75
76
        // action permissions. By default, only admin are allowed
77
        $resolver
78 7
            ->setDefault('permissions', [
79
                'ROLE_ADMIN'
80 7
            ]);
81
82
        // by default, all exports type are allowed
83
        $resolver
84 7
            ->setDefault('export', [
85 7
                'json',
86 7
                'html',
87 7
                'csv',
88
                'xls'
89 7
            ]);
90
91
        // entity will be retrived with this order. It should be an array of field/order mapping
92
        $resolver
93 7
            ->setDefault('order', [])
94 7
            ->setAllowedTypes('order', 'array');
95
96
        // the action route should be a string
97
        $resolver
98 7
            ->setDefault('route', '')
99 7
            ->setAllowedTypes('route', 'string')
100
            ->setNormalizer('route', function (Options $options, $value) {
101 7
                if (!$value) {
102
                    // if no route was provided, it should be linked to an Admin
103 7
                    if (!$this->admin) {
104
                        throw new InvalidOptionsException('No route was provided for action : ' . $this->actionName);
105
                    }
106
107
                    // generate default route from admin
108 7
                    return $this
109
                        ->admin
110 7
                        ->generateRouteName($this->actionName);
111
                }
112
113 1
                return $value;
114 7
            });
115
116
        // action parameters should be an array
117
        $resolver
118 7
            ->setDefault('route_parameters', [])
119 7
            ->setAllowedTypes('route_parameters', 'array');
120
121
        // font awesome icons
122
        $resolver
123 7
            ->setDefault('icon', '')
124 7
            ->setAllowedTypes('icon', 'string');
125
126
        // load strategy : determine which method should be called in the data provider
127
        $resolver
128 7
            ->setDefault('load_strategy', AdminInterface::LOAD_STRATEGY_UNIQUE)
129 7
            ->addAllowedValues('load_strategy', AdminInterface::LOAD_STRATEGY_NONE)
130 7
            ->addAllowedValues('load_strategy', AdminInterface::LOAD_STRATEGY_UNIQUE)
131 7
            ->addAllowedValues('load_strategy', AdminInterface::LOAD_STRATEGY_MULTIPLE)
132
            ->setNormalizer('load_strategy', function (Options $options, $value) {
133
134 7
                if (!$value) {
135
                    if ($this->actionName == 'create') {
136
                        $value = AdminInterface::LOAD_STRATEGY_NONE;
137
                    } else if ($this->actionName == 'list') {
138
                        $value = AdminInterface::LOAD_STRATEGY_MULTIPLE;
139
                    } else {
140
                        $value = AdminInterface::LOAD_STRATEGY_UNIQUE;
141
                    }
142
                }
143
144 7
                return $value;
145 7
            });
146
147
        // pagination configuration
148
        $resolver
149 7
            ->setDefault('pager', 'pagerfanta')
150 7
            ->addAllowedValues('pager', 'pagerfanta')
151 7
            ->addAllowedValues('pager', false)
152
        ;
153
154
        // criteria used to find entity in the data provider
155
        $resolver
156 7
            ->setDefault('criteria', [])
157 7
            ->setNormalizer('criteria', function (Options $options, $value) {
158
159 7
                if (!$value) {
160
                    $idActions = [
161 7
                        'edit',
162
                        'delete'
163 7
                    ];
164
165 7
                    if (in_array($this->actionName, $idActions)) {
166
                        $value = [
167
                            'id'
168 1
                        ];
169 1
                    }
170 7
                }
171
172 7
                return $value;
173 7
            })
174
        ;
175
176
        // filters
177 7
        $resolver->setDefault('filters', []);
178
179
        // menus
180 7
        $resolver->setDefault('menus', []);
181 7
    }
182
}
183