Completed
Pull Request — master (#1)
by Daniel
10:00
created

PhpcrOdmExtension   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 6
lcom 0
cbo 12
dl 0
loc 64
rs 10
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getDefaultConfig() 0 6 1
B load() 0 54 5
1
<?php
2
3
namespace Psi\Bridge\ObjectAgent\Doctrine\PhpcrOdm\Tests\Functional;
4
5
use PhpBench\DependencyInjection\Container as BaseContainer;
6
use PhpBench\DependencyInjection\ExtensionInterface;
7
use PhpBench\DependencyInjection\Container;
8
use Psi\Bridge\ObjectAgent\Doctrine\PhpcrOdm\PhpcrOdmAgent;
9
use Doctrine\DBAL\DriverManager;
10
use Jackalope\Transport\DoctrineDBAL\RepositorySchema;
11
use Jackalope\RepositoryFactoryDoctrineDBAL;
12
use PHPCR\SimpleCredentials;
13
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
14
use Doctrine\ODM\PHPCR\Configuration;
15
use Doctrine\ODM\PHPCR\DocumentManager;
16
use Doctrine\ODM\PHPCR\Mapping\Driver\XmlDriver;
17
use Doctrine\ODM\PHPCR\Mapping\Driver\AnnotationDriver;
18
use Doctrine\Common\Annotations\AnnotationReader;
19
use Doctrine\ODM\PHPCR\NodeTypeRegistrator;
20
21
class PhpcrOdmExtension implements ExtensionInterface
22
{
23
    public function getDefaultConfig()
24
    {
25
        return [
26
            'db_path' => __DIR__ . '/../../../../cache/test.sqlite',
27
        ];
28
    }
29
30
    public function load(Container $container)
31
    {
32
        $container->register('phpcr_odm', function (Container $container) {
33
            $dbPath = $container->getParameter('db_path');
34
            $registerNodeTypes = false;
35
36
            $connection = DriverManager::getConnection([
37
                'driver'    => 'pdo_sqlite',
38
                'path' => $dbPath,
39
            ]);
40
41
            // automatically setup the schema if the db doesn't exist yet.
42
            if (!file_exists($dbPath)) {
43
                if (!file_exists($dir = dirname($dbPath))) {
44
                    mkdir($dir);
45
                }
46
47
                $schema = new RepositorySchema();
48
                foreach ($schema->toSql($connection->getDatabasePlatform()) as $sql) {
49
                    $connection->exec($sql);
50
                }
51
52
                $registerNodeTypes = true;
53
            }
54
55
            $factory = new RepositoryFactoryDoctrineDBAL();
56
            $repository = $factory->getRepository([
57
                'jackalope.doctrine_dbal_connection' => $connection,
58
            ]);
59
            $session = $repository->login(new SimpleCredentials(null, null), 'default');
60
61
            if ($registerNodeTypes) {
62
                $typeRegistrator = new NodeTypeRegistrator();
63
                $typeRegistrator->registerNodeTypes($session);
64
            }
65
66
            $xmlDriver = new XmlDriver([__DIR__ . '/mappings']);
67
            $annotationDriver = new AnnotationDriver(new AnnotationReader(), [
68
                __DIR__ . '/../../../vendor/doctrine/phpcr-odm/lib/Doctrine/ODM/PHPCR/Document',
69
            ]);
70
            $chain = new MappingDriverChain();
71
            $chain->addDriver($xmlDriver, 'Psi\Bridge\ObjectAgent\Doctrine\PhpcrOdm\Tests\Functional\Model');
72
            $chain->addDriver($annotationDriver, 'Doctrine');
73
74
            $config = new Configuration();
75
            $config->setMetadataDriverImpl($chain);
76
77
            return DocumentManager::create($session, $config);
78
        });
79
80
        $container->register('psi_object_agent.phpcr_odm', function (Container $container) {
81
            return new PhpcrOdmAgent($container->get('phpcr_odm'));
82
        });
83
    }
84
}
85