PersistServiceFactory   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 22
c 1
b 0
f 0
dl 0
loc 52
rs 10
wmc 6

1 Method

Rating   Name   Duplication   Size   Complexity  
B __invoke() 0 36 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Arp\LaminasEntity\Factory\Repository\Persistence;
6
7
use Arp\DoctrineEntityRepository\Persistence\PersistService;
8
use Arp\DoctrineEntityRepository\Persistence\PersistServiceInterface;
9
use Arp\EventDispatcher\EventDispatcher;
10
use Arp\EventDispatcher\Listener\ListenerProvider;
11
use Arp\LaminasFactory\AbstractFactory;
12
use Arp\LaminasFactory\Exception\ServiceNotCreatedException;
13
use Doctrine\ORM\EntityManager;
14
use Interop\Container\ContainerInterface;
15
use Psr\Log\NullLogger;
16
17
/**
18
 * @author  Alex Patterson <[email protected]>
19
 * @package Arp\LaminasEntity\Factory\Repository\Persistence
20
 */
21
final class PersistServiceFactory extends AbstractFactory
22
{
23
    /**
24
     * @var string
25
     */
26
    private $defaultClassName = PersistService::class;
27
28
    /**
29
     * @param ContainerInterface $container
30
     * @param string             $requestedName
31
     * @param array|null         $options
32
     *
33
     * @return PersistServiceInterface
34
     *
35
     * @throws ServiceNotCreatedException If the persist service cannot be created.
36
     */
37
    public function __invoke(
38
        ContainerInterface $container,
39
        $requestedName,
40
        array $options = null
41
    ): PersistServiceInterface {
42
        $options = $options ?? $this->getServiceOptions($container, $requestedName);
43
44
        $className = $options['class_name'] ?? $this->defaultClassName;
45
        $entityName = $options['entity_name'] ?? null;
46
47
        if (null === $entityName || !is_string($entityName)) {
48
            throw new ServiceNotCreatedException(
49
                sprintf('The required \'entity_name\' configuration option is missing for service %s', $requestedName)
50
            );
51
        }
52
53
        $entityManager = $options['entity_manager'] ?? EntityManager::class;
54
        if (is_string($entityManager)) {
55
            $entityManager = $this->getService($container, $entityManager, $requestedName);
56
        }
57
58
        $listenerProvider = $options['listener_provider'] ?? ListenerProvider::class;
59
        if (is_string($listenerProvider)) {
60
            $listenerProvider = $this->getService($container, $listenerProvider, $requestedName);
61
        }
62
63
        $logger = $options['logger'] ?? NullLogger::class;
64
        if (is_string($logger)) {
65
            $logger = $this->getService($container, $logger, $requestedName);
66
        }
67
68
        return new $className(
69
            $entityName,
70
            $entityManager,
71
            new EventDispatcher($listenerProvider),
72
            $logger
73
        );
74
    }
75
}
76