Completed
Push — dev-master ( b7e24f...52af7d )
by Derek Stephen
03:02
created

Application   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 27.27%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 9
dl 0
loc 129
ccs 12
cts 44
cp 0.2727
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 1 1
A __clone() 0 1 1
A ahoy() 0 14 3
A isMultilingual() 0 5 1
A i18nRequestCheck() 0 13 2
A getContainer() 0 4 1
A setConfigFolder() 0 4 1
A setEnvironment() 0 4 1
A setSail() 0 25 3
1
<?php
2
3
namespace Bone\Mvc;
4
5
use Barnacle\Container;
6
use Barnacle\RegistrationInterface;
7
use Bone\Mvc\Router\Decorator\ExceptionDecorator;
8
use Bone\Mvc\Router\Decorator\NotFoundDecorator;
9
use Bone\Mvc\Router\PlatesStrategy;
10
use Bone\Mvc\Router\RouterConfigInterface;
11
use Bone\Mvc\View\PlatesEngine;
12
use Bone\Server\Environment;
13
use Bone\Server\I18nHandler;
14
use League\Route\Http\Exception\NotFoundException;
15
use League\Route\Router;
16
use League\Route\RouteGroup;
17
use League\Route\Strategy\ApplicationStrategy;
18
use League\Route\Strategy\JsonStrategy;
19
use PDO;
20
use Psr\Http\Message\ResponseInterface;
21
use Psr\Http\Message\ServerRequestInterface;
22
use Zend\Diactoros\ResponseFactory;
23
use Zend\Diactoros\ServerRequestFactory;
24
use Zend\Diactoros\Response;
25
use Zend\Diactoros\Response\RedirectResponse;
26
use Zend\HttpHandlerRunner\Emitter\SapiEmitter;
27
28
class Application
29
{
30
    /** @var Container $registry */
31
    private $treasureChest;
32
33
    /** @var string $configFolder */
34
    private $configFolder = 'config';
35
36
    /** @var string $environment */
37
    private $environment = 'production';
38
39
    /**
40
     *  There be nay feckin wi' constructors on board this ship
41
     *  There be nay copyin' o' th'ship either
42
     *  This ship is a singleton!
43
     */
44
    public function __construct(){}
45
    public function __clone(){}
46
47
48
    /**
49
     *  Ahoy! There nay be boardin without yer configuration
50
     *
51
     * @param array $config
0 ignored issues
show
Bug introduced by
There is no parameter named $config. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
52
     * @return Application
53
     */
54 1
    public static function ahoy()
55
    {
56 1
        static $inst = null;
57 1
        if ($inst === null)
58
        {
59 1
            $inst = new Application();
60 1
            $inst->treasureChest = new Container();
61 1
            $env = getenv('APPLICATION_ENV');
62 1
            if ($env) {
63 1
                $inst->setEnvironment($env);
64
            }
65
        }
66 1
        return $inst;
67
    }
68
69
70
    /**
71
     *
72
     * T' the high seas! Garrr!
73
     *
74
     * @return bool
75
     * @throws \Exception
76
     */
77
    public function setSail()
78
    {
79
        // load in the config and set up the dependency injection container
80
        $env = new Environment($_SERVER);
81
        $request = ServerRequestFactory::fromGlobals($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);
82
        $router = $this->treasureChest[Router::class] = new Router();
83
        $config = $env->fetchConfig($this->configFolder, $this->environment);
84
        $package = new ApplicationPackage($config, $router);
85
        $package->addToContainer($this->treasureChest);
86
        if ($this->isMultilingual()) {
87
            try {
88
                $request = $this->i18nRequestCheck($request);
89
                $response = $router->dispatch($request);
90
            } catch (NotFoundException $e) {
91
                $response = new RedirectResponse($e->getMessage());
92
            }
93
        } else {
94
            $request = $this->i18nRequestCheck($request, false);
95
            $response = $router->dispatch($request);
96
        }
97
98
        (new SapiEmitter)->emit($response);
99
100
        return true;
101
    }
102
103
    /**
104
     * @return bool
105
     */
106
    public function isMultilingual(): bool
107
    {
108
        $i18n = $this->treasureChest->get('i18n');
109
        return $i18n['enabled'];
110
    }
111
112
113
    /**
114
     * @param ServerRequestInterface $request
115
     * @param bool $handle
116
     * @return ServerRequestInterface
117
     * @throws NotFoundException
118
     */
119
    private function i18nRequestCheck(ServerRequestInterface $request, bool $handle = true): ServerRequestInterface
120
    {
121
        $i18n = $this->treasureChest->get('i18n');
122
        $translator = $this->treasureChest->get('translator');
123
        $i18nHandler = new I18nHandler($translator, $i18n['supported_locales']);
124
        if ($handle){
125
            $request = $i18nHandler->handleI18n($request);
126
        } else {
127
            $request = $i18nHandler->removeI18n($request);
128
        }
129
130
        return $request;
131
    }
132
133
    /**
134
     * @return Container
135
     */
136
    public function getContainer(): Container
137
    {
138
        return $this->treasureChest;
139
    }
140
141
    /**
142
     * @param string $configFolder
143
     */
144
    public function setConfigFolder(string $configFolder)
145
    {
146
        $this->configFolder = $configFolder;
147
    }
148
149
    /**
150
     * @param string $environment
151
     */
152 1
    public function setEnvironment(string $environment)
153
    {
154 1
        $this->environment = $environment;
155
    }
156
}