Passed
Pull Request — 5.1 (#158)
by David
05:07
created

MoufDiListener::onGenerate()   B

Complexity

Conditions 8
Paths 28

Size

Total Lines 44

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 44
rs 7.9715
c 0
b 0
f 0
cc 8
nc 28
nop 2
1
<?php
2
3
4
namespace Mouf\Database\TDBM\Utils;
5
6
use TheCodingMachine\TDBM\ConfigurationInterface;
7
use Mouf\Database\TDBM\MoufConfiguration;
8
use TheCodingMachine\TDBM\TDBMService;
9
use Mouf\MoufManager;
10
use TheCodingMachine\TDBM\Utils\GeneratorListenerInterface;
11
use TheCodingMachine\TDBM\Utils\TDBMDaoGenerator;
12
use function var_export;
13
14
class MoufDiListener implements GeneratorListenerInterface
15
{
16
17
    /**
18
     * @param ConfigurationInterface $configuration
19
     * @param BeanDescriptorInterface[] $beanDescriptors
20
     */
21
    public function onGenerate(ConfigurationInterface $configuration, array $beanDescriptors): void
22
    {
23
        // Let's generate the needed instance in Mouf.
24
        $moufManager = MoufManager::getMoufManager();
25
26
        $daoFactoryInstanceName = null;
27
        if ($configuration instanceof MoufConfiguration) {
28
            $daoFactoryInstanceName = $configuration->getDaoFactoryInstanceName();
29
            $daoFactoryClassName = $configuration->getDaoNamespace().'\\Generated\\'.$configuration->getNamingStrategy()->getDaoFactoryClassName();
30
            $moufManager->declareComponent($daoFactoryInstanceName, $daoFactoryClassName, false, MoufManager::DECLARE_ON_EXIST_KEEP_INCOMING_LINKS);
31
        }
32
33
        $tdbmServiceInstanceName = $this->getTdbmInstanceName($configuration);
34
35
        foreach ($beanDescriptors as $beanDescriptor) {
36
            $daoName = $beanDescriptor->getDaoClassName();
37
38
            // Rename all DAOs to full-class name (migration from 5.0 to 5.1+ naming schema)
39
            $instanceName = TDBMDaoGenerator::toVariableName($daoName);
40
            if ($moufManager->instanceExists($instanceName) && !$moufManager->instanceExists($configuration->getDaoNamespace().'\\'.$daoName)) {
41
                $moufManager->renameComponent($instanceName, $configuration->getDaoNamespace().'\\'.$daoName);
42
43
                // Let's create a "Link" between old Mouf::getXXXDao and new Mouf::getNamespaceXXXDao
44
                $moufManager->createInstanceByCode()->setName($instanceName)->setCode('return $container->get('.var_export($configuration->getDaoNamespace().'\\'.$daoName, true).');');
45
46
                // Let's unset the setter. It is useless now.
47
                if ($daoFactoryInstanceName !== null) {
48
                    $moufManager->unsetParameterForSetter($daoFactoryInstanceName, 'set'.$daoName);
49
                }
50
            }
51
52
            $instanceName = $configuration->getDaoNamespace().'\\'.$daoName;
53
            if (!$moufManager->instanceExists($instanceName)) {
54
                $moufManager->declareComponent($instanceName, $configuration->getDaoNamespace().'\\'.$daoName);
55
            }
56
            $moufManager->setParameterViaConstructor($instanceName, 0, $tdbmServiceInstanceName, 'object');
57
        }
58
59
        if ($daoFactoryInstanceName !== null) {
60
            $moufManager->setParameterViaConstructor($daoFactoryInstanceName, 0, 'return $container;', 'primitive', 'php');
61
        }
62
63
        $moufManager->rewriteMouf();
64
    }
65
66
    private function getTdbmInstanceName(ConfigurationInterface $configuration) : string
67
    {
68
        $moufManager = MoufManager::getMoufManager();
69
70
        $configurationInstanceName = $moufManager->findInstanceName($configuration);
71
        if (!$configurationInstanceName) {
72
            throw new \TDBMException('Could not find TDBM instance for configuration object.');
73
        }
74
75
        // Let's find the configuration
76
        $tdbmServicesNames = $moufManager->findInstances(TDBMService::class);
77
78
        foreach ($tdbmServicesNames as $name) {
79
            if ($moufManager->getInstanceDescriptor($name)->getConstructorArgumentProperty('configuration')->getValue()->getName() === $configurationInstanceName) {
80
                return $name;
81
            }
82
        }
83
84
        throw new \TDBMException('Could not find TDBMService instance.');
85
    }
86
}
87