Completed
Push — master ( 9ba851...d8a65a )
by Vladimir
09:32 queued 26s
created

BanFormCreator::build()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 59
Code Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 59
rs 9.597
cc 1
eloc 39
nc 1
nop 1

How to fix   Long Method   

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
 * This file contains a form creator for Bans
4
 *
5
 * @license    https://github.com/allejo/bzion/blob/master/LICENSE.md GNU General Public License Version 3
6
 */
7
8
namespace BZIon\Form\Creator;
9
10
use BZIon\Form\Type\AdvancedModelType;
11
use BZIon\Form\Type\IpType;
12
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
13
use Symfony\Component\Form\Extension\Core\Type\DateType;
14
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
15
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
16
use Symfony\Component\Form\Extension\Core\Type\TextType;
17
use Symfony\Component\Form\Form;
18
use Symfony\Component\Validator\Constraints\Length;
19
use Symfony\Component\Validator\Constraints\NotBlank;
20
21
/**
22
 * Form creator for bans
23
 *
24
 * @property \Ban $editing
25
 */
26
class BanFormCreator extends ModelFormCreator
27
{
28
    /**
29
     * {@inheritdoc}
30
     */
31
    protected function build($builder)
32
    {
33
        $builder
34
            ->add('player', new AdvancedModelType('player'), [
35
                'constraints' => [
36
                    new NotBlank()
37
                ],
38
                'disabled' => $this->isEdit(),
39
                'required' => true,
40
            ])
41
            ->add('expiration', DateType::class, [
42
                'data' => \TimeDate::now(),
43
                'label' => 'Expiration Date',
44
                'required' => false,
45
            ])
46
            ->add('is_permanent', CheckboxType::class, [
47
                'label' => 'Permanent Ban',
48
                'required' => false,
49
                'attr' => [
50
                    'data-help-message' => 'When checked, no expiration date needs to be set and will be ignored',
51
                ],
52
            ])
53
            ->add('reason', TextareaType::class, [
54
                'constraints' => [
55
                    new NotBlank()
56
                ],
57
                'required' => true,
58
            ])
59
            ->add('is_soft_ban', CheckboxType::class, [
60
                'label' => 'Soft Ban',
61
                'required' => false,
62
                'attr' => [
63
                    'data-help-message' => "A soft ban will not affect a player's permissions on this site; e.g. a mute",
64
                ],
65
            ])
66
            ->add('server_message', TextType::class, [
67
                'required' => false,
68
                'constraints' => [
69
                    new Length([
70
                        'max' => 150,
71
                    ]),
72
                ],
73
                'attr' => [
74
                    'data-help-message' => 'The ban message that will appear on match servers',
75
                ],
76
            ])
77
            ->add('ip_addresses', new IpType(), [
78
                'label' => 'IP Addresses',
79
                'required' => false,
80
                'attr' => [
81
                    'data-help-message' => 'The IP addresses that will be banned on match servers. Use commas to separate multiple IPs.',
82
                ],
83
            ])
84
        ;
85
86
        return $builder->add('submit', SubmitType::class, [
87
            'label' => 'Enter Ban',
88
        ]);
89
    }
90
91
    /**
92
     * {@inheritdoc}
93
     *
94
     * @param \Ban $ban
95
     */
96
    public function fill($form, $ban)
97
    {
98
        $form->get('player')->setData($ban->getVictim());
99
        $form->get('is_permanent')->setData($ban->isPermanent());
100
        $form->get('reason')->setData($ban->getReason());
101
        $form->get('is_soft_ban')->setData($ban->isSoftBan());
102
        $form->get('server_message')->setData($ban->getServerMessage());
103
        $form->get('ip_addresses')->setData($ban->getIpAddresses());
104
105
        if (!$ban->isPermanent()) {
106
            $form->get('expiration')->setData($ban->getExpiration());
107
        }
108
    }
109
110
    /**
111
     * {@inheritdoc}
112
     *
113
     * @param \Ban $ban
114
     */
115
    public function update($form, $ban)
116
    {
117
        $ban
118
            ->setIPs($form->get('ip_addresses')->getData())
119
            ->setExpiration($this->getExpiration($form))
0 ignored issues
show
Bug introduced by
It seems like $this->getExpiration($form) can be null; however, setExpiration() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
120
            ->setReason($form->get('reason')->getData())
121
            ->setServerMessage($form->get('server_message')->getData())
122
            ->setSoftBan($form->get('is_soft_ban')->getData())
123
        ;
124
    }
125
126
    /**
127
     * {@inheritdoc}
128
     */
129
    public function enter($form)
130
    {
131
        return
132
            \Ban::addBan(
133
                $form->get('player')->getData()->getId(),
134
                $this->me->getId(),
135
                $this->getExpiration($form),
136
                $form->get('reason')->getData(),
137
                $form->get('server_message')->getData(),
138
                $form->get('ip_addresses')->getData(),
139
                $form->get('is_soft_ban')->getData()
140
            )
141
        ;
142
    }
143
144
    /**
145
     * Get the expiration time of the ban based on the fields of the form
146
     *
147
     * @param  Form          $form The form
148
     *
149
     * @return \TimeDate|null
150
     */
151
    private function getExpiration($form)
152
    {
153
        if ($form->get('is_permanent')->getData()) {
154
            return null;
155
        }
156
157
        return $form->get('expiration')->getData();
158
    }
159
}
160