Completed
Pull Request — master (#7)
by Paul
01:48
created

ApplicationPackage::setConfigArray()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php
2
3
namespace Bone;
4
5
use Barnacle\Container;
6
use Barnacle\EntityRegistrationInterface;
7
use Barnacle\RegistrationInterface;
8
use Bone\Console\CommandRegistrationInterface;
9
use Bone\Console\ConsoleApplication;
10
use Bone\Console\ConsolePackage;
11
use Bone\Db\DbPackage;
12
use Bone\Firewall\FirewallPackage;
13
use Bone\Http\Middleware\Stack;
14
use Bone\Http\MiddlewareAwareInterface;
15
use Bone\I18n\I18nPackage;
16
use Bone\I18n\I18nRegistrationInterface;
17
use Bone\Log\LogPackage;
18
use Bone\Controller\DownloadController;
19
use Bone\Router\Router;
20
use Bone\Router\RouterConfigInterface;
21
use Bone\Router\RouterPackage;
22
use Bone\View\ViewEngine;
23
use Bone\I18n\Service\TranslatorFactory;
24
use Bone\View\ViewPackage;
25
use League\Plates\Template\Folders;
26
use League\Route\Strategy\JsonStrategy;
27
use Laminas\Diactoros\ResponseFactory;
28
use Laminas\I18n\Translator\Translator;
29
use Psr\Http\Server\MiddlewareInterface;
30
31
class ApplicationPackage implements RegistrationInterface
32
{
33
    /** @var array $config */
34
    private $config;
35
36
    /** @var Router $router */
37
    private $router;
38
39
    /**
40
     * ApplicationPackage constructor.
41
     * @param array $config
42
     * @param Router $router
43
     */
44 1
    public function __construct(array $config, Router $router)
45
    {
46 1
        $this->config = $config;
47 1
        $this->router = $router;
48 1
    }
49
50
    /**
51
     * @param Container $c
52
     * @throws \Bone\Exception
53
     * @throws \Exception
54
     */
55 1
    public function addToContainer(Container $c)
56
    {
57 1
        $this->setConfigArray($c);
58 1
        $this->setupLogs($c);
59 1
        $this->setupPdoConnection($c);
60 1
        $this->setupViewEngine($c);
61 1
        $this->setupRouter($c);
62 1
        $this->initMiddlewareStack($c);
63 1
        $this->initConsoleApp($c);
64 1
        $this->setupTranslator($c);
65 1
        $this->setupPackages($c);
66 1
        $this->setupVendorViewOverrides($c);
67 1
        $this->setupDownloadController($c);
68 1
        $this->setupRouteFirewall($c);
69 1
        $this->setupMiddlewareStack($c);
70 1
        $this->setupConsoleApp($c);
71 1
    }
72
73
    /**
74
     * @param Container $c
75
     */
76 1
    private function setConfigArray(Container $c)
77
    {
78 1
        foreach ($this->config as $key => $value) {
79 1
            $c[$key] = $value;
80
        }
81 1
    }
82
83
    /**
84
     * @param Container $c
85
     */
86 1
    private function setupViewEngine(Container $c)
87
    {
88 1
        $package = new ViewPackage();
89 1
        $package->addToContainer($c);
90 1
    }
91
92
    /**
93
     * @param Container $c
94
     */
95 1
    private function setupRouter(Container $c)
96
    {
97 1
        $package = new RouterPackage();
98 1
        $package->addToContainer($c);
99 1
    }
100
101
    /**
102
     * @param Container $c
103
     */
104 1
    private function setupPackages(Container $c)
105
    {
106
        // set up the modules and vendor package modules
107 1
        $c['consoleCommands'] = [];
108 1
        $packages = $c->get('packages');
109 1
        $this->addEntityPathsFromPackages($packages, $c);
110
111 1
        reset($packages);
112
113 1
        foreach ($packages as $packageName) {
114 1
            if (class_exists($packageName)) {
115 1
                $this->registerPackage($packageName, $c);
116
            }
117
        }
118 1
    }
119
120
    /**
121
     * @param string $packageName
122
     * @param Container $c
123
     */
124 1
    private function registerPackage(string $packageName, Container $c): void
125
    {
126
        /** @var RegistrationInterface $package */
127 1
        $package = new $packageName();
128 1
        $package->addToContainer($c);
129 1
        $this->registerRoutes($package, $c);
130 1
        $this->registerTranslations($package, $c);
131 1
        $this->registerMiddleware($package, $c);
132 1
        $this->registerConsoleCommands($package, $c);
133 1
    }
134
135
    /**
136
     * @param RegistrationInterface $package
137
     */
138 1
    private function registerConsoleCommands(RegistrationInterface $package, Container $c): void
139
    {
140 1
        $consoleCommands = $c->get('consoleCommands');
141
142 1
        if ($package instanceof CommandRegistrationInterface) {
143 1
            $commands = $package->registerConsoleCommands($c);
144
145 1
            foreach ($commands as $command) {
146 1
                $consoleCommands[] = $command;
147
            }
148
        }
149
150 1
        $c['consoleCommands'] = $consoleCommands;
151 1
    }
152
153
    /**
154
     * @param RegistrationInterface $package
155
     */
156 1
    private function registerMiddleware(RegistrationInterface $package, Container $c): void
157
    {
158 1
        if ($package instanceof MiddlewareAwareInterface) {
159 1
            $stack = $c->get(Stack::class);
160 1
            $package->addMiddleware($stack, $c);
161
        }
162 1
    }
163
164
    /**
165
     * @param RegistrationInterface $package
166
     */
167 1
    private function registerRoutes(RegistrationInterface $package, Container $c): void
168
    {
169 1
        if ($package instanceof RouterConfigInterface) {
170 1
            $package->addRoutes($c, $this->router);
171
        }
172 1
    }
173
174
    /**
175
     * @param RegistrationInterface $package
176
     */
177 1
    private function registerTranslations(RegistrationInterface $package, Container $c): void 
178
    {
179 1
        $i18n = $c->get('i18n');
180
        /** @var Translator $translator */
181 1
        $translator = $c->get(Translator::class);
182
183 1
        if ($package instanceof I18nRegistrationInterface) {
184 1
            foreach ($i18n['supported_locales'] as $locale) {
185 1
                $factory = new TranslatorFactory();
186 1
                $factory->addPackageTranslations($translator, $package, $locale);
187
            }
188
        }
189 1
    }
190
191
    /**
192
     * @param Container $c
193
     */
194 1
    private function initConsoleApp(Container $c): void
195
    {
196 1
        $c[ConsoleApplication::class] = new ConsoleApplication();
197 1
    }
198
199
    /**
200
     * @param Container $c
201
     */
202 1
    private function setupConsoleApp(Container $c): void
203
    {
204 1
        $package = new ConsolePackage();
205 1
        $package->addToContainer($c);
206 1
    }
207
208
    /**
209
     * @param array $packages
210
     * @param Container $c
211
     */
212 1
    private function addEntityPathsFromPackages(array $packages, Container $c): void
213
    {
214 1
        foreach ($packages as $packageName) {
215 1
            if (class_exists($packageName)) {
216
                /** @var RegistrationInterface $package */
217 1
                $package = new $packageName();
218
219 1
                if ($package instanceof EntityRegistrationInterface) {
220 1
                    $paths = $c['entity_paths'];
221 1
                    $paths[] = $package->getEntityPath();
222 1
                    $c['entity_paths'] = $paths;
223
                }
224
            }
225
        }
226 1
    }
227
228
    /**
229
     * @param Container $c
230
     * @throws \Bone\Exception
231
     */
232 1
    private function setupTranslator(Container $c)
233
    {
234 1
        $package = new I18nPackage();
235 1
        $package->addToContainer($c);
236 1
        $package->addMiddleware($c->get(Stack::class), $c);
237 1
    }
238
239
240
    /**
241
     * @param Container $c
242
     * @throws \Bone\Exception
243
     */
244 1
    private function setupPdoConnection(Container $c)
245
    {
246 1
        $package = new DbPackage();
247 1
        $package->addToContainer($c);
248 1
    }
249
250
    /**
251
     * @param Container $c
252
     */
253 1
    private function setupDownloadController(Container $c): void
254
    {
255 1
        $uploadDirectory = $c->get('uploads_dir');
256 1
        $c[DownloadController::class] = new DownloadController($uploadDirectory);
257 1
        $strategy = new JsonStrategy(new ResponseFactory());
258 1
        $strategy->setContainer($c);
259 1
        $this->router->map('GET', '/download', [DownloadController::class, 'downloadAction'])->setStrategy($strategy);
260 1
    }
261
262
    /**
263
     * @param Container $c
264
     */
265 1
    private function setupRouteFirewall(Container $c): void
266
    {
267 1
        $pckage = new FirewallPackage();
268 1
        $pckage->addToContainer($c);
269 1
    }
270
271
    /**
272
     * @param Container $c
273
     * @throws \Exception
274
     */
275 1
    private function  setupLogs(Container $c)
276
    {
277 1
        $package = new LogPackage();
278 1
        $package->addToContainer($c);
279 1
    }
280
281
    /**
282
     * @param Container $c
283
     */
284 1
    private function setupVendorViewOverrides(Container $c): void
285
    {
286
        /** @var ViewEngine $viewEngine */
287 1
        $viewEngine = $c->get(ViewEngine::class);
288 1
        $views = $c->get('views');
289 1
        $registeredViews = $viewEngine->getFolders();
290
291 1
        foreach ($views as $view => $folder) {
292 1
            $this->overrideViewFolder($view, $folder, $registeredViews);
293
        }
294 1
    }
295
296
    /**
297
     * @param string $view
298
     * @param string $folder
299
     * @param Folders $registeredViews
300
     */
301 1
    private function overrideViewFolder(string $view, string $folder, Folders $registeredViews): void
302
    {
303 1
        if ($registeredViews->exists($view)) {
304
            /** @var \League\Plates\Template\Folder $currentFolder */
305
            $currentFolder = $registeredViews->get($view);
306
            $currentFolder->setPath($folder);
307
        }
308 1
    }
309
310
    /**
311
     * @param Container $c
312
     */
313 1
    private function initMiddlewareStack(Container $c): void
314
    {
315 1
        $router = $c->get(Router::class);
316 1
        $c[Stack::class] = new Stack($router);
317 1
    }
318
319
    /**
320
     * @param Container $c
321
     */
322 1
    private function setupMiddlewareStack(Container $c): void
323
    {
324 1
        $stack = $c->get(Stack::class);
325 1
        $middlewareStack = $c->has('stack') ? $c->get('stack') : [];
326
327 1
        foreach ($middlewareStack as $middleware) {
328 1
            if ($middleware instanceof MiddlewareInterface) {
329 1
                $stack->addMiddleWare($middleware);
330 1
            } elseif ($c->has($middleware)) {
331 1
                $stack->addMiddleWare($c->get($middleware));
332
            } else {
333 1
                $stack->addMiddleWare(new $middleware());
334
            }
335
        }
336 1
    }
337
}
338