Completed
Push — dev-master ( 2915d1...bb4a55 )
by Derek Stephen
02:08
created

Application::ahoy()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 9
cts 9
cp 1
rs 9.8333
c 0
b 0
f 0
cc 3
nc 3
nop 0
crap 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
    private function __construct(){}
45
46
    public function __clone(){}
47
48
49
    /**
50
     *  Ahoy! There nay be boardin without yer configuration
51
     *
52
     * @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...
53
     * @return Application
54
     */
55 4
    public static function ahoy()
56
    {
57 4
        static $inst = null;
58 4
        if ($inst === null) {
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 4
        return $inst;
67
    }
68
69
70
    /**
71
     *
72
     * T' the high seas! Garrr!
73
     *
74
     * @return bool
75
     * @throws \Exception
76
     */
77 2
    public function setSail()
78
    {
79
        // load in the config and set up the dependency injection container
80 2
        $env = new Environment($_SERVER);
81 2
        $request = ServerRequestFactory::fromGlobals($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);
82 2
        $router = $this->treasureChest[Router::class] = new Router();
83 2
        $config = $env->fetchConfig($this->configFolder, $this->environment);
84 2
        $package = new ApplicationPackage($config, $router);
85 2
        $package->addToContainer($this->treasureChest);
86
87 2
        if ($this->isMultilingual()) {
88
89
            try {
90 2
                $request = $this->i18nRequestCheck($request);
91 2
                $response = $router->dispatch($request);
92
            } catch (NotFoundException $e) {
93 2
                $response = new RedirectResponse($e->getMessage());
94
            }
95
96
        } else {
97
            $request = $this->i18nRequestCheck($request, false);
98
            $response = $router->dispatch($request);
99
        }
100
101 2
        (new SapiEmitter)->emit($response);
102
103 2
        return true;
104
    }
105
106
    /**
107
     * @return bool
108
     */
109 2
    public function isMultilingual(): bool
110
    {
111 2
        $i18n = $this->treasureChest->get('i18n');
112 2
        return $i18n['enabled'];
113
    }
114
115
116
    /**
117
     * @param ServerRequestInterface $request
118
     * @param bool $handle
119
     * @return ServerRequestInterface
120
     * @throws NotFoundException
121
     */
122 2
    private function i18nRequestCheck(ServerRequestInterface $request, bool $handle = true): ServerRequestInterface
123
    {
124 2
        $i18n = $this->treasureChest->get('i18n');
125 2
        $translator = $this->treasureChest->get('translator');
126 2
        $i18nHandler = new I18nHandler($translator, $i18n['supported_locales']);
127 2
        if ($handle) {
128 2
            $request = $i18nHandler->handleI18n($request);
129
        } else {
130
            $request = $i18nHandler->removeI18n($request);
131
        }
132
133 2
        return $request;
134
    }
135
136
    /**
137
     * @return Container
138
     */
139 1
    public function getContainer(): Container
140
    {
141 1
        return $this->treasureChest;
142
    }
143
144
    /**
145
     * @param string $configFolder
146
     */
147 2
    public function setConfigFolder(string $configFolder)
148
    {
149 2
        $this->configFolder = $configFolder;
150 2
    }
151
152
    /**
153
     * @param string $environment
154
     */
155 1
    public function setEnvironment(string $environment)
156
    {
157 1
        $this->environment = $environment;
158
    }
159
}