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

Application::setEnvironment()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
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
}