Completed
Push — master ( a5c053...b57f56 )
by Raffael
15:30 queued 11:35
created

WorkerFactory::setErrorHandler()   B

Complexity

Conditions 6
Paths 1

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
dl 0
loc 35
ccs 0
cts 29
cp 0
rs 8.7377
c 0
b 0
f 0
cc 6
nc 1
nop 1
crap 42
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * balloon
7
 *
8
 * @copyright   Copryright (c) 2012-2019 gyselroth GmbH (https://gyselroth.com)
9
 * @license     GPL-3.0 https://opensource.org/licenses/GPL-3.0
10
 */
11
12
namespace Balloon\Async;
13
14
use Balloon\Bootstrap\ContainerBuilder;
15
use Composer\Autoload\ClassLoader as Composer;
16
use ErrorException;
17
use MongoDB\BSON\ObjectId;
18
use Psr\Log\LoggerInterface;
19
use TaskScheduler\Worker;
20
use TaskScheduler\WorkerFactoryInterface;
21
use TaskScheduler\WorkerManager;
22
23
class WorkerFactory implements WorkerFactoryInterface
24
{
25
    /**
26
     * Composer.
27
     *
28
     * @var Composer
29
     */
30
    protected $composer;
31
32
    /**
33
     * Construct.
34
     */
35
    public function __construct(Composer $composer)
36
    {
37
        $this->composer = $composer;
38
    }
39
40
    /**
41
     * {@inheritdoc}
42
     */
43
    public function buildWorker(ObjectId $id): Worker
44
    {
45
        $dic = ContainerBuilder::get($this->composer);
46
        $this->setErrorHandler($dic->get(LoggerInterface::class));
47
48
        return $dic->make(Worker::class, [
49
            'id' => $id,
50
        ]);
51
    }
52
53
    /**
54
     * {@inheritdoc}
55
     */
56
    public function buildManager(): WorkerManager
57
    {
58
        $dic = ContainerBuilder::get($this->composer);
59
        $this->setErrorHandler($dic->get(LoggerInterface::class));
60
61
        return $dic->get(WorkerManager::class);
62
    }
63
64
    /**
65
     * Set error handler.
66
     */
67
    protected function setErrorHandler(LoggerInterface $logger): self
68
    {
69
        set_error_handler(function ($severity, $message, $file, $line) use ($logger) {
70
            $log = $message.' in '.$file.':'.$line;
71
72
            switch ($severity) {
73
                case E_ERROR:
74
                case E_USER_ERROR:
75
                    $logger->error($log, [
76
                        'category' => get_class($this),
77
                    ]);
78
79
                break;
80
                case E_WARNING:
81
                case E_USER_WARNING:
82
                    $logger->warning($log, [
83
                        'category' => get_class($this),
84
                    ]);
85
86
                break;
87
                default:
88
                    $logger->debug($log, [
89
                        'category' => get_class($this),
90
                    ]);
91
92
                break;
93
            }
94
95
            if (error_reporting() !== 0) {
96
                throw new ErrorException($message, 0, $severity, $file, $line);
97
            }
98
        });
99
100
        return $this;
101
    }
102
}
103