Passed
Pull Request — master (#464)
by Kirill
12:51
created

ContainerRegistry   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 71
rs 10
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A className() 0 8 1
A getSerializer() 0 13 3
A getHandler() 0 13 3
A __construct() 0 5 1
1
<?php
2
3
/**
4
 * Spiral Framework.
5
 *
6
 * @license   MIT
7
 * @author    Anton Titov (Wolfy-J)
8
 */
9
10
declare(strict_types=1);
11
12
namespace Spiral\Jobs\Registry;
13
14
use Psr\Container\ContainerInterface;
15
use Spiral\Core\Exception\Container\ContainerException;
16
use Spiral\Jobs\Exception\JobException;
17
use Spiral\Jobs\HandlerInterface;
18
use Spiral\Jobs\HandlerRegistryInterface;
19
use Spiral\Jobs\JsonSerializer;
20
use Spiral\Jobs\SerializerInterface;
21
use Spiral\Jobs\SerializerRegistryInterface;
22
23
/**
24
 * Resolve handler from container binding.
25
 */
26
final class ContainerRegistry implements HandlerRegistryInterface, SerializerRegistryInterface
27
{
28
    /** @var ContainerInterface */
29
    private $container;
30
31
    /** @var SerializerInterface */
32
    private $defaultSerializer;
33
34
    /** @var \Doctrine\Inflector\Inflector */
35
    private $inflector;
36
37
    /**
38
     * @param ContainerInterface       $container
39
     * @param SerializerInterface|null $defaultSerializer
40
     */
41
    public function __construct(ContainerInterface $container, SerializerInterface $defaultSerializer = null)
42
    {
43
        $this->container = $container;
44
        $this->defaultSerializer = $defaultSerializer ?? new JsonSerializer();
45
        $this->inflector = (new \Doctrine\Inflector\Rules\English\InflectorFactory())->build();
46
    }
47
48
    /**
49
     * @inheritdoc
50
     */
51
    public function getHandler(string $jobType): HandlerInterface
52
    {
53
        try {
54
            $handler = $this->container->get($this->className($jobType));
55
        } catch (ContainerException $e) {
56
            throw new JobException($e->getMessage(), $e->getCode(), $e);
57
        }
58
59
        if (!$handler instanceof HandlerInterface) {
60
            throw new JobException("Unable to resolve job handler for `{$jobType}`");
61
        }
62
63
        return $handler;
64
    }
65
66
    /**
67
     * @param string $jobType
68
     * @return SerializerInterface
69
     */
70
    public function getSerializer(string $jobType): SerializerInterface
71
    {
72
        try {
73
            $handler = $this->getHandler($jobType);
74
        } catch (JobException $e) {
75
            return $this->defaultSerializer;
76
        }
77
78
        if ($handler instanceof SerializerInterface) {
79
            return $handler;
80
        }
81
82
        return $this->defaultSerializer;
83
    }
84
85
    /**
86
     * @param string $jobType
87
     * @return string
88
     */
89
    private function className(string $jobType): string
90
    {
91
        $names = explode('.', $jobType);
92
        $names = array_map(function (string $value) {
93
            return $this->inflector->classify($value);
94
        }, $names);
95
96
        return join('\\', $names);
97
    }
98
}
99