Passed
Pull Request — 4.2 (#140)
by David
05:07
created

MoufDiListener::onGenerate()   B

Complexity

Conditions 5
Paths 10

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 8.439
c 0
b 0
f 0
cc 5
eloc 17
nc 10
nop 2
1
<?php
2
3
4
namespace Mouf\Database\TDBM\Utils;
5
6
use Mouf\Database\TDBM\ConfigurationInterface;
7
use Mouf\Database\TDBM\MoufConfiguration;
8
use Mouf\Database\TDBM\TDBMService;
9
use Mouf\MoufManager;
10
11
class MoufDiListener implements GeneratorListenerInterface
12
{
13
14
    /**
15
     * @param ConfigurationInterface $configuration
16
     * @param BeanDescriptorInterface[] $beanDescriptors
17
     */
18
    public function onGenerate(ConfigurationInterface $configuration, array $beanDescriptors): void
19
    {
20
        // Let's generate the needed instance in Mouf.
21
        $moufManager = MoufManager::getMoufManager();
22
23
        $daoFactoryInstanceName = null;
24
        if ($configuration instanceof MoufConfiguration) {
25
            $daoFactoryInstanceName = $configuration->getDaoFactoryInstanceName();
26
            $daoFactoryClassName = $configuration->getDaoNamespace().'\\Generated\\'.$configuration->getNamingStrategy()->getDaoFactoryClassName();
27
            $moufManager->declareComponent($daoFactoryInstanceName, $daoFactoryClassName, false, MoufManager::DECLARE_ON_EXIST_KEEP_INCOMING_LINKS);
28
        }
29
30
        $tdbmServiceInstanceName = $this->getTdbmInstanceName($configuration);
31
32
        foreach ($beanDescriptors as $beanDescriptor) {
33
            $daoName = $beanDescriptor->getDaoClassName();
34
35
            $instanceName = TDBMDaoGenerator::toVariableName($daoName);
36
            if (!$moufManager->instanceExists($instanceName)) {
37
                $moufManager->declareComponent($instanceName, $configuration->getDaoNamespace().'\\'.$daoName);
38
            }
39
            $moufManager->setParameterViaConstructor($instanceName, 0, $tdbmServiceInstanceName, 'object');
40
            if ($daoFactoryInstanceName !== null) {
41
                $moufManager->bindComponentViaSetter($daoFactoryInstanceName, 'set'.$daoName, $instanceName);
42
            }
43
        }
44
45
        $moufManager->rewriteMouf();
46
    }
47
48
    private function getTdbmInstanceName(ConfigurationInterface $configuration) : string
49
    {
50
        $moufManager = MoufManager::getMoufManager();
51
52
        $configurationInstanceName = $moufManager->findInstanceName($configuration);
53
        if (!$configurationInstanceName) {
54
            throw new \TDBMException('Could not find TDBM instance for configuration object.');
55
        }
56
57
        // Let's find the configuration
58
        $tdbmServicesNames = $moufManager->findInstances(TDBMService::class);
59
60
        foreach ($tdbmServicesNames as $name) {
61
            if ($moufManager->getInstanceDescriptor($name)->getConstructorArgumentProperty('configuration')->getValue()->getName() === $configurationInstanceName) {
62
                return $name;
63
            }
64
        }
65
66
        throw new \TDBMException('Could not find TDBMService instance.');
67
    }
68
}
69