EntityType::getBlockPrefix()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
/*
4
 * This file is part of Biurad opensource projects.
5
 *
6
 * @copyright 2019 Biurad Group (https://biurad.com/)
7
 * @license   https://opensource.org/licenses/BSD-3-Clause License
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
namespace Flange\Database\Doctrine\Form\Type;
14
15
use Doctrine\ORM\Query\Parameter;
16
use Doctrine\ORM\QueryBuilder;
17
use Doctrine\Persistence\ObjectManager;
18
use Flange\Database\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
19
use Symfony\Component\Form\Exception\UnexpectedTypeException;
20
use Symfony\Component\OptionsResolver\Options;
21
use Symfony\Component\OptionsResolver\OptionsResolver;
22
23
class EntityType extends DoctrineType
24
{
25
    public function configureOptions(OptionsResolver $resolver): void
26
    {
27
        parent::configureOptions($resolver);
28
29
        // Invoke the query builder closure so that we can cache choice lists
30
        // for equal query builders
31
        $queryBuilderNormalizer = function (Options $options, $queryBuilder) {
32
            if (\is_callable($queryBuilder)) {
33
                $queryBuilder = $queryBuilder($this->registry->getRepository($options['class']));
34
35
                if (null !== $queryBuilder && !$queryBuilder instanceof QueryBuilder) {
36
                    throw new UnexpectedTypeException($queryBuilder, QueryBuilder::class);
37
                }
38
            }
39
40
            return $queryBuilder;
41
        };
42
43
        $resolver->setNormalizer('query_builder', $queryBuilderNormalizer);
44
        $resolver->setAllowedTypes('query_builder', ['null', 'callable', QueryBuilder::class]);
45
    }
46
47
    /**
48
     * Return the default loader object.
49
     *
50
     * @param QueryBuilder $queryBuilder
51
     */
52
    public function getLoader(ObjectManager $manager, object $queryBuilder, string $class): ORMQueryBuilderLoader
53
    {
54
        if (!$queryBuilder instanceof QueryBuilder) {
55
            throw new \TypeError(\sprintf('Expected an instance of "%s", but got "%s".', QueryBuilder::class, \get_debug_type($queryBuilder)));
56
        }
57
58
        return new ORMQueryBuilderLoader($queryBuilder);
59
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64
    public function getBlockPrefix(): string
65
    {
66
        return 'entity';
67
    }
68
69
    /**
70
     * We consider two query builders with an equal SQL string and
71
     * equal parameters to be equal.
72
     *
73
     * @param QueryBuilder $queryBuilder
74
     *
75
     * @internal This method is public to be usable as callback. It should not
76
     *           be used in user code.
77
     */
78
    public function getQueryBuilderPartsForCachingHash(object $queryBuilder): ?array
79
    {
80
        if (!$queryBuilder instanceof QueryBuilder) {
81
            throw new \TypeError(\sprintf('Expected an instance of "%s", but got "%s".', QueryBuilder::class, \get_debug_type($queryBuilder)));
82
        }
83
84
        return [
85
            $queryBuilder->getQuery()->getSQL(),
86
            \array_map([$this, 'parameterToArray'], $queryBuilder->getParameters()->toArray()),
87
        ];
88
    }
89
90
    /**
91
     * Converts a query parameter to an array.
92
     */
93
    private function parameterToArray(Parameter $parameter): array
94
    {
95
        return [$parameter->getName(), $parameter->getType(), $parameter->getValue()];
96
    }
97
}
98