Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Passed
Pull Request — master (#924)
by
unknown
03:44
created

DiContainer::initializeContainer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 2
rs 10
1
<?php declare(strict_types=1);
2
3
namespace Smr\Container;
4
5
use DI\Container;
6
use DI\ContainerBuilder;
7
use Dotenv\Dotenv;
8
use MySqlDatabase;
9
use mysqli;
10
use RuntimeException;
11
use Smr\MySqlProperties;
12
use function DI\autowire;
13
14
/**
15
 * Class DiContainer
16
 * A wrapper around the DI\Container functionality that will allow
17
 * static usage of container methods.
18
 * @package Smr\Container
19
 */
20
class DiContainer {
21
	private static DiContainer $instance;
22
	private Container $container;
23
24
	private function __construct() {
25
		$this->container = $this->buildContainer();
26
	}
27
28
	private function getDefinitions(): array {
29
		return [
30
			/*
31
			 * mysqli is a 3rd party library, and we do not have control over its constructor.
32
			 * In order for PHP-DI to construct an instance of a class, each constructor argument must
33
			 * be able to be constructed.
34
			 * PHP-DI cannot construct mysqli by itself, because all of its arguments are primitive types.
35
			 * Therefore, we need to declare a provider factory for the container to use when constructing new instances.
36
			 *
37
			 * The factories themselves are able to use dependency injection as well, so we can provide the MysqlProperties
38
			 * typehint to make sure the container constructs and instance and provides it to the factory.
39
			 */
40
			mysqli::class => function (MySqlProperties $mysqlProperties): mysqli {
41
				// Set the mysqli driver to raise exceptions on errors
42
				if (!mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)) {
43
					throw new RuntimeException('Failed to enable mysqli error reporting');
44
				}
45
				return new mysqli(
46
					$mysqlProperties->getHost(),
47
					$mysqlProperties->getUser(),
48
					$mysqlProperties->getPassword(),
49
					$mysqlProperties->getDatabaseName());
50
			},
51
			Dotenv::class => function (): Dotenv {
52
				return Dotenv::createArrayBacked(ROOT);
53
			},
54
			// Explicitly name all classes that are autowired, so we can take advantage of
55
			// the compiled container feature for a performance boost
56
			MySqlProperties::class => autowire(),
57
			MySqlDatabase::class => autowire()
58
		];
59
	}
60
61
	private function buildContainer(): Container {
62
		$builder = new ContainerBuilder();
63
		$builder
64
			->addDefinitions($this->getDefinitions())
65
			->useAnnotations(false)
66
			->useAutowiring(true);
67
		if (!isset($_ENV["DISABLE_PHPDI_COMPILATION"])) {
68
			// The CompiledContainer.php will be saved to the /tmp directory on the Docker container once
69
			// during its lifecycle (first request)
70
			$builder->enableCompilation("/tmp");
71
		}
72
		return $builder->build();
73
	}
74
75
	/**
76
	 * Create a new DI\Container instance.
77
	 * This needs to be done once during a bootstrapping script, like htdocs/config.inc
78
	 */
79
	public static function initializeContainer(): void {
80
		self::$instance = new DiContainer();
81
	}
82
83
	/**
84
	 * Retrieve the managed instance of $className, or construct a new instance with all dependencies.
85
	 * @param string $className The name of the class to retrieve from the container.
86
	 * @return mixed
87
	 * @throws \DI\DependencyException
88
	 * @throws \DI\NotFoundException
89
	 */
90
	public static function get(string $className) {
91
		return self::getContainer()->get($className);
92
	}
93
94
	/**
95
	 * Construct a fresh instance of $className. Dependencies will be retrieved from the container if they
96
	 * are already managed, and created themselves if they are not.
97
	 * @param string $className The name of the class to construct.
98
	 * @return mixed
99
	 * @throws \DI\DependencyException
100
	 * @throws \DI\NotFoundException
101
	 */
102
	public static function make(string $className) {
103
		return self::getContainer()->make($className);
104
	}
105
106
	/**
107
	 * Return the raw dependency injection Container instance for more robust
108
	 * container management operations.
109
	 * @return Container
110
	 */
111
	public static function getContainer(): Container {
112
		return self::$instance->container;
113
	}
114
}
115