Test Setup Failed
Push — master ( ec418a...867dc1 )
by Php Easy Api
03:31
created

ServiceProvider::checkInServiceJsonForProvider()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 9
c 0
b 0
f 0
nc 6
nop 1
dl 0
loc 17
rs 9.9666
1
<?php
2
3
namespace Resta\Provider;
4
5
use Resta\Support\Utils;
6
use Resta\Support\JsonHandler;
7
use Resta\Support\SerializeClassProcess;
8
use Resta\Foundation\ApplicationProvider;
9
use Resta\Exception\FileNotFoundException;
10
11
class ServiceProvider extends  ApplicationProvider
12
{
13
    /**
14
     * all service providers
15
     *
16
     * @var array
17
     */
18
    protected $providers = [];
19
20
    /**
21
     * apply provider class
22
     *
23
     * @param $key
24
     * @param $provider
25
     * @param string $method
26
     *
27
     * @throws FileNotFoundException
28
     */
29
    private function applyProvider($key,$provider,$method='register')
30
    {
31
        // If the provider classes are a real object
32
        // we will run them.
33
        if(Utils::isNamespaceExists($provider)){
34
35
            // after determining whether the register or boot methods
36
            // we are running the provider.
37
            /** @scrutinizer ignore-call */
38
            if($this->app->runningInConsole()===false){
39
                $providerInstance = $this->checkInServiceJsonForProvider($provider);
40
            }
41
            else{
42
                $providerInstance = $this->app->resolve($provider);
43
            }
44
45
            //we need to do method check for provider.
46
            if(method_exists($providerInstance,$method)){
47
                $providerInstance->{$method}();
48
49
                if($method=="register"){
50
                    /** @scrutinizer ignore-call */
51
                    $this->app->register('loadedProviders',$key,$provider);
52
                }
53
            }
54
        }
55
    }
56
57
    /**
58
     * assign loadedProviders core value
59
     *
60
     * @return mixed|void
61
     */
62
    private function assignerLoadedProvidersInitialCoreValue()
63
    {
64
        if(!isset($this->app['loadedProviders'])){
65
66
            // for loaded providers,
67
            // we register an empty array for the container object.
68
            /** @scrutinizer ignore-call */
69
            $this->app->register('loadedProviders',[]);
70
        }
71
    }
72
73
    /**
74
     * check in service.json for provider
75
     *
76
     * @param $provider
77
     * @return mixed
78
     *
79
     * @throws FileNotFoundException
80
     */
81
    private function checkInServiceJsonForProvider($provider)
82
    {
83
        JsonHandler::$file = serviceJson();
84
        $data = JsonHandler::get();
85
86
        if(!isset($data['providers'][$provider])){
87
            $serviceRegister = JsonHandler::set('providers',[$provider=>SerializeClassProcess::set($provider)]);
88
        }
89
90
        if(isset($serviceRegister)){
91
            $data = JsonHandler::get();
92
            if(!isset($data['providers'][$provider])){
93
                return $this->app->resolve($provider);
94
            }
95
        }
96
97
        return SerializeClassProcess::get($data['providers'][$provider]);
98
    }
99
100
    /**
101
     * get all service providers
102
     *
103
     * @return array
104
     */
105
    public function getServiceProviders()
106
    {
107
        //set service providers for providers property
108
        /** @scrutinizer ignore-call */
109
        $providers = $this->app->serviceProviders();
110
111
        if(count($providers)){
112
            $this->providers = $providers;
113
        }
114
115
        return $this->providers;
116
    }
117
118
    /**
119
     * handle service providers
120
     *
121
     * @throws FileNotFoundException
122
     */
123
    public function handle()
124
    {
125
        define ('serviceprovider',true);
126
127
        //check providers and resolve
128
        $this->resolveProviders($this->getServiceProviders());
129
    }
130
131
    /**
132
     * resolve providers
133
     *
134
     * @param array $providers
135
     *
136
     * @throws FileNotFoundException
137
     */
138
    public function resolveProviders($providers=array())
139
    {
140
        // for loaded providers,
141
        // we register an empty array for the container object.
142
        $this->assignerLoadedProvidersInitialCoreValue();
143
144
        //first we are running register methods of provider classes.
145
        foreach($providers as $key=>$provider){
146
147
            // providers can only be installed once.
148
            // apply providers and register for kernel
149
            if(!isset($this->app['loadedProviders'][$key])){
150
                $this->applyProvider($key,$provider);
151
            }
152
        }
153
154
        //then we are running boot methods of provider classes.
155
        foreach($providers as $key=>$provider){
156
157
            //if the providers register is already booted.
158
            if(isset($this->app['loadedProviders'][$key])){
159
                $this->applyProvider($key,$provider,'boot');
160
            }
161
        }
162
    }
163
}