LoadsServiceProvidersTrait   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
eloc 31
c 2
b 0
f 0
dl 0
loc 77
ccs 7
cts 7
cp 1
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A registerServiceProviders() 0 3 2
A bootstrapServiceProviders() 0 3 2
A loadServiceProviders() 0 24 2
1
<?php
2
/**
3
 * @package   WPEmerge
4
 * @author    Atanas Angelov <[email protected]>
5
 * @copyright 2017-2019 Atanas Angelov
6
 * @license   https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
7
 * @link      https://wpemerge.com/
8
 */
9
10
namespace WPEmerge\Application;
11
12
use Pimple\Container;
13
use WPEmerge\Controllers\ControllersServiceProvider;
14
use WPEmerge\Csrf\CsrfServiceProvider;
15
use WPEmerge\Exceptions\ConfigurationException;
16
use WPEmerge\Exceptions\ExceptionsServiceProvider;
17
use WPEmerge\Flash\FlashServiceProvider;
18
use WPEmerge\Input\OldInputServiceProvider;
19
use WPEmerge\Kernels\KernelsServiceProvider;
20
use WPEmerge\Middleware\MiddlewareServiceProvider;
21
use WPEmerge\Requests\RequestsServiceProvider;
22
use WPEmerge\Responses\ResponsesServiceProvider;
23
use WPEmerge\Routing\RoutingServiceProvider;
24
use WPEmerge\ServiceProviders\ServiceProviderInterface;
25
use WPEmerge\Support\Arr;
26
use WPEmerge\View\ViewServiceProvider;
27
28
/**
29
 * Load service providers.
30
 */
31
trait LoadsServiceProvidersTrait {
32
	/**
33
	 * Array of default service providers.
34
	 *
35
	 * @var string[]
36
	 */
37
	protected $service_providers = [
38
		ApplicationServiceProvider::class,
39
		KernelsServiceProvider::class,
40
		ExceptionsServiceProvider::class,
41
		RequestsServiceProvider::class,
42
		ResponsesServiceProvider::class,
43
		RoutingServiceProvider::class,
44
		ViewServiceProvider::class,
45
		ControllersServiceProvider::class,
46
		MiddlewareServiceProvider::class,
47
		CsrfServiceProvider::class,
48
		FlashServiceProvider::class,
49
		OldInputServiceProvider::class,
50
	];
51
52
	/**
53
	 * Register and bootstrap all service providers.
54
	 *
55
	 * @codeCoverageIgnore
56
	 * @param  Container $container
57
	 * @return void
58
	 */
59
	protected function loadServiceProviders( Container $container ) {
60
		$container[ WPEMERGE_SERVICE_PROVIDERS_KEY ] = array_merge(
61
			$this->service_providers,
62
			Arr::get( $container[ WPEMERGE_CONFIG_KEY ], 'providers', [] )
63
		);
64
65
		$service_providers = array_map( function ( $service_provider ) use ( $container ) {
66
			if ( ! is_subclass_of( $service_provider, ServiceProviderInterface::class ) ) {
67
				throw new ConfigurationException(
68
					'The following class is not defined or does not implement ' .
69
					ServiceProviderInterface::class . ': ' . $service_provider
70
				);
71
			}
72
73
			// Provide container access to the service provider instance
74
			// so bootstrap hooks can be unhooked e.g.:
75
			// remove_action( 'some_action', [\App::resolve( SomeServiceProvider::class ), 'methodAddedToAction'] );
76
			$container[ $service_provider ] = new $service_provider();
77
78
			return $container[ $service_provider ];
79
		}, $container[ WPEMERGE_SERVICE_PROVIDERS_KEY ] );
80
81
		$this->registerServiceProviders( $service_providers, $container );
82
		$this->bootstrapServiceProviders( $service_providers, $container );
83
	}
84
85
	/**
86
	 * Register all service providers.
87
	 *
88
	 * @param  ServiceProviderInterface[] $service_providers
89
	 * @param  Container                  $container
90
	 * @return void
91
	 */
92 1
	protected function registerServiceProviders( $service_providers, Container $container ) {
93 1
		foreach ( $service_providers as $provider ) {
94 1
			$provider->register( $container );
95
		}
96 1
	}
97
98
	/**
99
	 * Bootstrap all service providers.
100
	 *
101
	 * @param  ServiceProviderInterface[] $service_providers
102
	 * @param  Container                  $container
103
	 * @return void
104
	 */
105 1
	protected function bootstrapServiceProviders( $service_providers, Container $container ) {
106 1
		foreach ( $service_providers as $provider ) {
107 1
			$provider->bootstrap( $container );
108
		}
109 1
	}
110
}
111