Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.67% covered (success)
91.67%
11 / 12
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Runtime
91.67% covered (success)
91.67%
11 / 12
75.00% covered (warning)
75.00%
3 / 4
5.01
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 __destruct
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
 get
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 context
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Console;
6
7use Celema\Container\Container;
8use Celema\Core\Factory\Factory;
9use Celema\Quma\Database;
10use Celema\Verba\Translator;
11use Celema\Verba\Verba;
12use Cosray\Cms;
13use Cosray\Config;
14use Cosray\Context;
15use Cosray\Locales;
16use Cosray\Node\Writer;
17
18/**
19 * Services resolved lazily in a scope without a request: for one console
20 * invocation, or for a batch of queued jobs.
21 *
22 * @internal
23 */
24final class Runtime
25{
26    private readonly Container $container;
27    private readonly ?Translator $previousTranslator;
28
29    /** @param Container $container the booted app's container */
30    public function __construct(Container $container)
31    {
32        $this->container = $container->scope();
33        $this->container->add(Context::class, self::context(...))->scoped();
34        $this->container->add(Cms::class)->scoped();
35        $this->container->add(Writer::class)->scoped();
36        $context = $this->container->instance(Context::class);
37        $this->previousTranslator = Verba::translator();
38        Verba::activate($context->translator());
39    }
40
41    public function __destruct()
42    {
43        if ($this->previousTranslator !== null) {
44            Verba::activate($this->previousTranslator);
45        } else {
46            Verba::deactivate();
47        }
48    }
49
50    /** @param class-string $class */
51    public function get(string $class): object
52    {
53        return $this->container->instance($class);
54    }
55
56    private static function context(
57        Database $db,
58        Config $config,
59        Container $container,
60        Factory $factory,
61        Locales $locales,
62    ): Context {
63        return Context::console($db, $config, $container, $factory, $locales);
64    }
65}