UserController::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.552
c 0
b 0
f 0
cc 1
nc 1
nop 10

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace SumoCoders\FrameworkMultiUserBundle\Controller;
4
5
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
6
use SumoCoders\FrameworkCoreBundle\BreadCrumb\BreadCrumbBuilder;
7
use SumoCoders\FrameworkMultiUserBundle\Command\Handler;
8
use SumoCoders\FrameworkMultiUserBundle\Form\DeleteType;
9
use SumoCoders\FrameworkMultiUserBundle\User\Interfaces\UserRepository;
10
use Symfony\Component\Form\Form;
11
use Symfony\Component\Form\FormFactoryInterface;
12
use Symfony\Component\HttpFoundation\RedirectResponse;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
15
use Symfony\Component\Routing\Router;
16
use Symfony\Component\Translation\TranslatorInterface;
17
18
/**
19
 * This class handles all the user actions.
20
 * Register a service for each action.
21
 */
22
class UserController
23
{
24
    /** @var FormFactoryInterface */
25
    private $formFactory;
26
27
    /** @var Router */
28
    private $router;
29
30
    /** @var FlashBagInterface */
31
    private $flashBag;
32
33
    /** @var TranslatorInterface */
34
    private $translator;
35
36
    /** @var Handler */
37
    private $handler;
38
39
    /** @var string */
40
    private $form;
41
42
    /** @var UserRepository */
43
    private $userRepository;
44
45
    /** @var BreadCrumbBuilder */
46
    private $breadcrumbBuilder;
47
48
    /** @var array */
49
    private $breadcrumbs;
50
51
    /** @var string */
52
    private $redirectRoute;
53
54
    public function __construct(
55
        FormFactoryInterface $formFactory,
56
        Router $router,
57
        FlashBagInterface $flashBag,
58
        TranslatorInterface $translator,
59
        string $form,
60
        Handler $handler,
61
        UserRepository $userRepository,
62
        BreadCrumbBuilder $breadcrumbBuilder,
63
        array $breadcrumbs,
64
        string $redirectRoute = null
65
    ) {
66
        $this->formFactory = $formFactory;
67
        $this->router = $router;
68
        $this->flashBag = $flashBag;
69
        $this->translator = $translator;
70
        $this->form = $form;
71
        $this->handler = $handler;
72
        $this->userRepository = $userRepository;
73
        $this->breadcrumbBuilder = $breadcrumbBuilder;
74
        $this->breadcrumbs = $breadcrumbs;
75
        $this->redirectRoute = $redirectRoute;
76
    }
77
78
    /**
79
     * @param Request $request
80
     * @param int|null $id
81
     *
82
     * @Template()
83
     *
84
     * @return array|RedirectResponse
85
     */
86
    public function baseAction(Request $request, int $id = null)
87
    {
88
        foreach ($this->breadcrumbs as $breadcrumb) {
89
            $uri = '';
90
            if ($breadcrumb['route'] !== '') {
91
                $uri = $this->router->generate($breadcrumb['route']);
92
            }
93
94
            $this->breadcrumbBuilder->addSimpleItem(ucfirst($this->translator->trans($breadcrumb['label'])), $uri);
95
        }
96
97
        $form = $this->getFormForId($id);
98
        $form->handleRequest($request);
99
100
        if ($form->isSubmitted() && $form->isValid()) {
101
            $command = $form->getData();
102
            $this->handler->handle($command);
103
104
            $this->flashBag->add(
105
                'success',
106
                $this->translator->trans(
107
                    $id === null ? 'sumocoders.multiuserbundle.flash.added' : 'sumocoders.multiuserbundle.flash.edited',
108
                    ['%user%' => $command->getEntity()->getDisplayName()]
109
                )
110
            );
111
112
            if ($this->redirectRoute !== null) {
113
                return new RedirectResponse($this->router->generate($this->redirectRoute));
114
            }
115
        }
116
117
        if ($id !== null) {
118
            $deleteForm = $this->formFactory->create(DeleteType::class, $form->getData());
119
120
            return [
121
                'form' => $form->createView(),
122
                'deleteForm' => $deleteForm->createView(),
123
                'user' => $form->getData()->getEntity(),
124
            ];
125
        }
126
127
        return ['form' => $form->createView()];
128
    }
129
130
    private function getFormForId(?int $id = null): Form
131
    {
132
        if ($id === null) {
133
            return $this->formFactory->create($this->form);
134
        }
135
136
        $user = $this->userRepository->find((int) $id);
137
        $dataTransferObjectClass = $this->form::getDataTransferObjectClass();
0 ignored issues
show
Bug introduced by
The method getDataTransferObjectClass cannot be called on $this->form (of type string).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
138
        $dataTransferObject = $dataTransferObjectClass::fromUser($user);
139
140
        return $this->formFactory->create($this->form, $dataTransferObject);
141
    }
142
}
143