Completed
Push — master ( 8e3ad0...af3303 )
by Daniel
05:46
created

FormPatchAction::__invoke()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
eloc 21
dl 0
loc 30
ccs 0
cts 13
cp 0
rs 8.9617
c 0
b 0
f 0
cc 6
nc 4
nop 2
crap 42
1
<?php
2
3
namespace Silverback\ApiComponentBundle\Controller;
4
5
use Silverback\ApiComponentBundle\Dto\Form\FormView;
6
use Silverback\ApiComponentBundle\Entity\Component\Form\Form;
7
use Symfony\Component\Form\FormInterface;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
11
class FormPatchAction extends AbstractFormAction
12
{
13
    private function getNestedKey(FormInterface $form, array $formData): FormInterface
14
    {
15
        $child = $form->get($key = key($formData));
16
        while(is_array($formData = $formData[$key]) && \count($formData) === 1) {
17
            $child = $child->get($key = key($formData));
18
        }
19
        return $child;
20
    }
21
22
    /**
23
     * @param Request $request
24
     * @param Form $data
25
     * @return Response
26
     */
27
    public function __invoke(Request $request, Form $data)
28
    {
29
        $contentType = $request->headers->get('CONTENT_TYPE');
30
        $_format = $request->attributes->get('_format') ?: $request->getFormat($contentType);
31
32
        $builder = $this->formFactory->create($data);
33
        $form = $builder->getForm();
34
        $formData = $this->deserializeFormData($form, $request->getContent());
35
        $form->submit($formData, false);
36
37
        $dataCount = \count($formData);
38
        if ($dataCount === 1) {
39
            $formItem = $this->getNestedKey($form, $formData);
40
            $data->setForm(new FormView($formItem->createView()));
41
            return $this->getResponse($data, $_format, $this->getFormValid($data->getForm()));
42
        }
43
44
        $datum = [];
45
        $valid = true;
46
        foreach ($formData as $key => $value) {
47
            $dataItem = clone $data;
48
            $formItem = $this->getNestedKey($form, $formData[$key]);
49
            $dataItem->setForm(new FormView($formItem->createView()));
50
            $datum[] = $dataItem;
51
            if ($valid && !$this->getFormValid($dataItem->getForm())) {
52
                $valid = false;
53
            }
54
        }
55
56
        return $this->getResponse($datum, $_format, $valid);
57
    }
58
}
59