Main::getDBConnection()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 1
b 0
f 0
1
<?php
2
/**
3
 * Main class file
4
 *
5
 * @package EBloodBank
6
 * @since   1.0
7
 */
8
namespace EBloodBank;
9
10
use Monolog;
11
use Aura\Di\ContainerBuilder;
12
13
/**
14
 * Main class
15
 *
16
 * @since 1.0
17
 */
18
class Main
19
{
20
    /**
21
     * The main container.
22
     *
23
     * @var \Aura\Di\Container
24
     * @since 1.2
25
     */
26
    protected $container;
27
28
    /**
29
     * @access private
30
     * @since 1.0
31
     */
32
    private function __construct()
33
    {
34
    }
35
36
    /**
37
     * @access private
38
     * @return void
39
     * @since 1.2
40
     */
41
    private function setupContainer()
42
    {
43
        $containerBuilder = new ContainerBuilder();
44
        $this->container = $containerBuilder->newConfiguredInstance([
45
            ContainerConfig::class,
46
        ]);
47
    }
48
49
    /**
50
     * @return \Aura\Di\Container
51
     * @since 1.2
52
     */
53
    public function getContainer()
54
    {
55
        return $this->container;
56
    }
57
58
    /**
59
     * @access private
60
     * @return void
61
     * @since 1.0
62
     */
63
    private function setupLogger()
64
    {
65
        // Register the logger as an exception handler, error handler and fatal error handler.
66
        Monolog\ErrorHandler::register($this->getLogger());
67
    }
68
69
    /**
70
     * @return \Monolog\Logger
71
     * @since 1.0
72
     */
73
    public function getLogger()
74
    {
75
        return $this->getContainer()->get('logger');
76
    }
77
78
    /**
79
     * @return \Zend\Diactoros\ServerRequest
80
     * @since 1.3
81
     */
82
    public function getServerRequest()
83
    {
84
        return $this->getContainer()->get('request');
85
    }
86
87
    /**
88
     * @access private
89
     * @return void
90
     * @since 1.0
91
     */
92
    private function setupTranslator()
93
    {
94
        $this->getTranslator()->register();
95
    }
96
97
    /**
98
     * @return \Gettext\Translator
99
     * @since 1.0
100
     */
101
    public function getTranslator()
102
    {
103
        return $this->getContainer()->get('translator');
104
    }
105
106
    /**
107
     * @access private
108
     * @return void
109
     * @since 1.0
110
     */
111
    private function setupDBConnection()
112
    {
113
        // Try to establish the database connection.
114
        tryDatabaseConnection($this->getDBConnection());
115
    }
116
117
    /**
118
     * @return \Doctrine\DBAL\Connection
119
     * @since 1.0
120
     */
121
    public function getDBConnection()
122
    {
123
        return $this->getContainer()->get('db_connection');
124
    }
125
126
    /**
127
     * @return \Doctrine\ORM\EntityManager
128
     * @since 1.0
129
     */
130
    public function getEntityManager()
131
    {
132
        return $this->getContainer()->get('entity_manager');
133
    }
134
135
    /**
136
     * @access private
137
     * @return void
138
     * @since 1.0
139
     */
140
    private function setupRouter()
141
    {
142
        $routerContainer = $this->getRouter();
143
144
        $routerMap = $routerContainer->getMap();
145
146
        /*
147
         * The application accepts the trailing slash for now
148
         * but this behavior may be changed in the near future.
149
         *
150
         * Please use one version of URLs in your content and templates.
151
         */
152
153
        $routerMap->route('home', '(/)?');
154
        $routerMap->route('login', '/login(/)?');
155
        $routerMap->route('logout', '/logout(/)?');
156
        $routerMap->route('signup', '/signup(/)?');
157
158
        $routerMap->route('settings', '/settings(/)?');
159
160
        $routerMap->route('view-donors', '/donors(/)?');
161
        $routerMap->route('add-donor', '/add/donor(/)?');
162
        $routerMap->route('view-donor', '/donor/{id}(/)?');
163
        $routerMap->route('edit-donors', '/edit/donors(/)?');
164
        $routerMap->route('edit-donor', '/edit/donor/{id}(/)?');
165
        $routerMap->route('delete-donors', '/delete/donors(/)?');
166
        $routerMap->route('delete-donor', '/delete/donor/{id}(/)?');
167
        $routerMap->route('approve-donors', '/approve/donors(/)?');
168
        $routerMap->route('approve-donor', '/approve/donor/{id}(/)?');
169
170
        $routerMap->route('view-users', '/users(/)?');
171
        $routerMap->route('add-user', '/add/user(/)?');
172
        $routerMap->route('view-user', '/user/{id}(/)?');
173
        $routerMap->route('edit-users', '/edit/users(/)?');
174
        $routerMap->route('edit-user', '/edit/user/{id}(/)?');
175
        $routerMap->route('delete-users', '/delete/users(/)?');
176
        $routerMap->route('delete-user', '/delete/user/{id}(/)?');
177
        $routerMap->route('activate-users', '/activate/users(/)?');
178
        $routerMap->route('activate-user', '/activate/user/{id}(/)?');
179
180
        $routerMap->route('view-cities', '/cities(/)?');
181
        $routerMap->route('add-city', '/add/city(/)?');
182
        $routerMap->route('view-city', '/city/{id}(/)?');
183
        $routerMap->route('edit-cities', '/edit/cities(/)?');
184
        $routerMap->route('edit-city', '/edit/city/{id}(/)?');
185
        $routerMap->route('delete-cities', '/delete/cities(/)?');
186
        $routerMap->route('delete-city', '/delete/city/{id}(/)?');
187
188
        $routerMap->route('view-districts', '/districts(/)?');
189
        $routerMap->route('add-district', '/add/district(/)?');
190
        $routerMap->route('view-district', '/district/{id}(/)?');
191
        $routerMap->route('edit-districts', '/edit/districts(/)?');
192
        $routerMap->route('edit-district', '/edit/district/{id}(/)?');
193
        $routerMap->route('delete-districts', '/delete/districts(/)?');
194
        $routerMap->route('delete-district', '/delete/district/{id}(/)?');
195
196
        $routerMatcher = $routerContainer->getMatcher();
197
        $routerMatcher->match($this->getServerRequest());
198
    }
199
200
    /**
201
     * @return \Aura\Router\RouterContainer
202
     * @since 1.0
203
     */
204
    public function getRouter()
205
    {
206
        return $this->getContainer()->get('router');
207
    }
208
209
    /**
210
     * @return \Swift_Mailer
211
     * @since 1.0
212
     */
213
    public function getMailer()
214
    {
215
        return $this->getContainer()->get('mailer');
216
    }
217
218
    /**
219
     * @access private
220
     * @return void
221
     * @since 1.0
222
     */
223
    private function setupCurrentLocale()
224
    {
225
        $defaultLocale = Locales::findLocale(EBB_DEFAULT_LOCALE);
226
        if (! empty($defaultLocale)) {
227
            Locales::setDefaultLocale($defaultLocale);
228
        }
229
230
        $siteLocale = Locales::findLocale(Options::getOption('site_locale'));
231
        if (! empty($siteLocale)) {
232
            Locales::setCurrentLocale($siteLocale);
233
        }
234
235
        $currentLocale = Locales::getCurrentLocale();
236
237
        if (! empty($currentLocale)) {
238
            $this->getTranslator()->loadTranslations($currentLocale->getTranslations());
239
        }
240
    }
241
242
    /**
243
     * @access private
244
     * @return void
245
     * @since 1.3
246
     */
247
    private function setupCurrentTheme()
248
    {
249
        $defaultTheme = Themes::findTheme(EBB_DEFAULT_THEME);
250
        if (! empty($defaultTheme)) {
251
            Themes::setDefaultTheme($defaultTheme);
252
        }
253
254
        $siteTheme = Themes::findTheme(Options::getOption('site_theme'));
255
        if (! empty($siteTheme)) {
256
            Themes::setCurrentTheme($siteTheme);
257
        }
258
259
        $currentLocale = Locales::getCurrentLocale();
260
261
        if (! empty($currentLocale)) {
262
            $currentTheme = Themes::getCurrentTheme();
263
            $themeLocale = $currentTheme->findLocale($currentLocale->getCode());
264
            if (! empty($themeLocale)) {
265
                $themeTranslations = $themeLocale->getTranslations();
266
                $themeDomain = $currentTheme->getData('Textdomain', $currentTheme->getName());
267
                $themeTranslations->setDomain($themeDomain);
268
                $this->getTranslator()->loadTranslations($themeTranslations);
269
            }
270
        }
271
    }
272
273
    /**
274
     * @return \Aura\Session\Session
275
     * @since 1.0.1
276
     */
277
    public function getSession()
278
    {
279
        return $this->getContainer()->get('session');
280
    }
281
282
    /**
283
     * @access private
284
     * @return void
285
     * @since 1.0
286
     */
287
    public function setupDispatcher()
288
    {
289
        $container = $this->getContainer();
290
        $controllers = [
291
            'home' => function () use ($container) {
292
                return new Controllers\Home($container);
293
            },
294
            'login' => function () use ($container) {
295
                return new Controllers\Login($container);
296
            },
297
            'signup' => function () use ($container) {
298
                return new Controllers\Signup($container);
299
            },
300
            'install' => function () use ($container) {
301
                return new Controllers\Install($container);
302
            },
303
            'settings' => function () use ($container) {
304
                return new Controllers\Settings($container);
305
            },
306
            'view-users' => function () use ($container) {
307
                return new Controllers\ViewUsers($container);
308
            },
309
            'view-donors' => function () use ($container) {
310
                return new Controllers\ViewDonors($container);
311
            },
312
            'view-cities' => function () use ($container) {
313
                return new Controllers\ViewCities($container);
314
            },
315
            'view-districts' => function () use ($container) {
316
                return new Controllers\ViewDistricts($container);
317
            },
318
            'view-donor' => function ($id) use ($container) {
319
                return new Controllers\ViewDonor($container, $id);
320
            },
321
            'add-user' => function () use ($container) {
322
                return new Controllers\AddUser($container);
323
            },
324
            'add-donor' => function () use ($container) {
325
                return new Controllers\AddDonor($container);
326
            },
327
            'add-city' => function () use ($container) {
328
                return new Controllers\AddCity($container);
329
            },
330
            'add-district' => function () use ($container) {
331
                return new Controllers\AddDistrict($container);
332
            },
333
            'edit-user' => function ($id) use ($container) {
334
                return new Controllers\EditUser($container, $id);
335
            },
336
            'edit-donor' => function ($id) use ($container) {
337
                return new Controllers\EditDonor($container, $id);
338
            },
339
            'edit-city' => function ($id) use ($container) {
340
                return new Controllers\EditCity($container, $id);
341
            },
342
            'edit-district' => function ($id) use ($container) {
343
                return new Controllers\EditDistrict($container, $id);
344
            },
345
            'delete-user' => function ($id) use ($container) {
346
                return new Controllers\DeleteUser($container, $id);
347
            },
348
            'delete-donor' => function ($id) use ($container) {
349
                return new Controllers\DeleteDonor($container, $id);
350
            },
351
            'delete-city' => function ($id) use ($container) {
352
                return new Controllers\DeleteCity($container, $id);
353
            },
354
            'delete-district' => function ($id) use ($container) {
355
                return new Controllers\DeleteDistrict($container, $id);
356
            },
357
            'activate-user' => function ($id) use ($container) {
358
                return new Controllers\ActivateUser($container, $id);
359
            },
360
            'approve-donor' => function ($id) use ($container) {
361
                return new Controllers\ApproveDonor($container, $id);
362
            },
363
            'edit-users' => function () use ($container) {
364
                return new Controllers\EditUsers($container);
365
            },
366
            'edit-donors' => function () use ($container) {
367
                return new Controllers\EditDonors($container);
368
            },
369
            'edit-cities' => function () use ($container) {
370
                return new Controllers\EditCities($container);
371
            },
372
            'edit-districts' => function () use ($container) {
373
                return new Controllers\EditDistricts($container);
374
            },
375
            'delete-users' => function () use ($container) {
376
                return new Controllers\DeleteUsers($container);
377
            },
378
            'delete-donors' => function () use ($container) {
379
                return new Controllers\DeleteDonors($container);
380
            },
381
            'delete-cities' => function () use ($container) {
382
                return new Controllers\DeleteCities($container);
383
            },
384
            'delete-districts' => function () use ($container) {
385
                return new Controllers\DeleteDistricts($container);
386
            },
387
            'activate-users' => function () use ($container) {
388
                return new Controllers\ActivateUsers($container);
389
            },
390
            'approve-donors' => function () use ($container) {
391
                return new Controllers\ApproveDonors($container);
392
            },
393
        ];
394
395
        $dispatcher = $this->getDispatcher();
396
        $dispatcher->setObjects($controllers);
397
    }
398
399
    /**
400
     * @return \Aura\Dispatcher\Dispatcher
401
     * @since 1.0
402
     */
403
    public function getDispatcher()
404
    {
405
        return $this->getContainer()->get('dispatcher');
406
    }
407
408
    /**
409
     * @return void
410
     * @since 1.0
411
     */
412
    public function dispatch()
413
    {
414
        $dispatcher = $this->getDispatcher();
415
        if (isInstaller()) {
416
            $dispatcher([], 'install');
417
        } else {
418
            switch (getInstallationStatus($this->getDBConnection())) {
419
                case DATABASE_NOT_SELECTED:
420
                case DATABASE_TABLE_NOT_EXIST:
421
                    redirect(getInstallerURL());
422
                    break;
423
424
                case DATABASE_NOT_CONNECTED:
425
                    $this->getContainer()->get('viewFactory')->displayView('error-db');
426
                    break;
427
428
                default:
429
                    $matchedRoute = $this->getRouter()->getMatcher()->getMatchedRoute();
430
                    if (empty($matchedRoute)) {
431
                        $this->getContainer()->get('viewFactory')->displayView('error-404');
432
                    } else {
433
                        try {
434
                            $dispatcher($matchedRoute->attributes, $matchedRoute->name);
435
                        } catch (\Aura\Dispatcher\Exception\ObjectNotDefined $ex) {
436
                            $this->getContainer()->get('viewFactory')->displayView('error-404');
437
                        }
438
                    }
439
                    break;
440
            }
441
        }
442
    }
443
444
    /** Singleton *************************************************************/
445
446
    /**
447
     * @return Main
448
     * @since 1.0
449
     * @static
450
     */
451
    public static function getInstance()
452
    {
453
        static $instance;
454
455
        if (is_null($instance)) {
456
            $instance = new self();
457
458
            // Sets up the container.
459
            $instance->setupContainer();
460
461
            // Sets up the logger.
462
            $instance->setupLogger();
463
464
            // Sets up the translator.
465
            $instance->setupTranslator();
466
467
            // Sets up the DB connection.
468
            $instance->setupDBConnection();
469
470
            // Sets up the current locale.
471
            $instance->setupCurrentLocale();
472
473
            // Sets up the current theme.
474
            $instance->setupCurrentTheme();
475
476
            // Sets up the router.
477
            $instance->setupRouter();
478
479
            // Sets up the dispatcher.
480
            $instance->setupDispatcher();
481
482
            // Dispatch!
483
            if (! isCLI()) {
484
                $instance->dispatch();
485
            }
486
        }
487
488
        return $instance;
489
    }
490
}
491