Passed
Push — main ( 60a874...8b25f3 )
by Dimitri
03:14 queued 12s
created

Application::initializeKint()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
2
3
/**
4
 * This file is part of Blitz PHP framework.
5
 *
6
 * (c) 2022 Dimitri Sitchet Tomkeu <[email protected]>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
namespace BlitzPHP\Core;
13
14
use BlitzPHP\Config\Config;
15
use BlitzPHP\Exceptions\ExceptionInterface;
16
use BlitzPHP\Loader\DotEnv;
17
use BlitzPHP\Loader\FileLocator;
18
use BlitzPHP\Loader\Injector;
19
use BlitzPHP\Router\Dispatcher;
20
use MirazMac\Requirements\Checker;
21
use ReflectionException;
22
23
class Application
24
{
25
    /**
26
     * Version du framework
27
     */
28
    public const VERSION = '1.0.0';
29
30
    /**
31
     * @var string Version de PHP minimale pour l'execution du framework
32
     */
33
    private const PHP_MIN_VERSION = '8.0.0';
34
35
    /**
36
     * @var array Liste des extensions requises pour le fonctionnement du framework
37
     */
38
    public const REQUIRED_EXTENSIONS = [
39
        'curl',
40
        'intl',
41
        'json',
42
        'mbstring',
43
        'reflection',
44
        'xml',
45
    ];
46
47
    /**
48
     * @throws ExceptionInterface
49
     * @throws ReflectionException
50
     */
51
    public function init(): self
52
    {
53
        /**
54
         * Verifie les exigences systeme
55
         */
56
        self::checkRequirements();
57
58
        /**
59
         * On charge les helpers `common` et `url` qui sont utilisés par le framework et presque toutes les applications
60
         */
61
        FileLocator::helper('common');
62
        FileLocator::helper('url');
63
64
        /**
65
         * On initialise le parsing du fichier .env
66
         */
67
        DotEnv::init(ROOTPATH);
68
69
        /**
70
         * On configure quelques extensions
71
         */
72
        self::configureExt();
73
74
        /**
75
         * Initialise les configurations du systeme a partir des fichiers se trouvant dans /app/config
76
         */
77
        Config::init();
78
79
        /**
80
         * On initialise le conteneur d'injection de dependences
81
         */
82
        Injector::init();
83
84
        /**
85
         * Lance la capture des exceptions et erreurs
86
         */
87
        // Exception::init();
88
89
        /**
90
         * Demarre la session
91
         */
92
        // Session::start();
93
94
        /**
95
         * Autocharge les elements specifiés par le dev a travers le fichier /app/config/autoload
96
         */
97
        // Load::init();
98
99
        return $this;
100
    }
101
102
    public function run(bool $return_response = false)
103
    {
104
        return Dispatcher::init($return_response);
105
    }
106
107
    /**
108
     * Vérifie si la version PHP est compatible et si toutes les extensions nécessaires sont chargées.
109
     */
110
    private static function checkRequirements()
111
    {
112
        $checker = (new Checker())
113
            // ->requirePhpVersion('>=' . self::PHP_MIN_VERSION)
114
            ->requirePhpExtensions(self::REQUIRED_EXTENSIONS)
115
            ->requireDirectory(SYST_PATH, Checker::CHECK_IS_READABLE)
116
            ->requireDirectory(APP_PATH, Checker::CHECK_IS_READABLE);
117
118
        $output = $checker->check();
0 ignored issues
show
Unused Code introduced by
The assignment to $output is dead and can be removed.
Loading history...
119
        if (! $checker->isSatisfied()) {
120
            echo '<h3>An error encourred</h3>';
121
122
            exit(implode('<br/> ', $checker->getErrors()));
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
123
        }
124
    }
125
126
    private static function configureExt()
127
    {
128
        $config = (object) Config::get('app');
129
130
        // Définir les paramètres régionaux par défaut sur le serveur
131
        if (function_exists('locale_set_default')) {
132
            locale_set_default($config->language ?? 'en');
133
        }
134
135
        // Définir le fuseau horaire par défaut sur le serveur
136
        if (function_exists('date_default_timezone_set')) {
137
            date_default_timezone_set($config->timezone ?? 'UTC');
138
        }
139
140
        /*
141
        * ------------------------------------------------------
142
        * Éléments importants liés au jeu de caractères
143
        * ------------------------------------------------------
144
        *
145
        * Configurez mbstring et/ou iconv s'ils sont activés
146
        * et définissez les constantes MB_ENABLED et ICONV_ENABLED, donc
147
        * que nous ne faisons pas à plusieurs reprises extension_loaded() ou
148
        * appels function_exists().
149
        *
150
        * Remarque : la classe UTF-8 en dépend. Cela se faisait
151
        * dans son constructeur, mais ce n'est _pas_ spécifique à une classe.
152
        *
153
        */
154
        $charset = strtoupper($config->charset);
155
        ini_set('default_charset', $charset);
156
157
        if (extension_loaded('mbstring')) {
158
            define('MB_ENABLED', true);
159
            // mbstring.internal_encoding est obsolète à partir de PHP 5.6
160
            // et son utilisation déclenche des messages E_DEPRECATED.
161
            @ini_set('mbstring.internal_encoding', $charset);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for ini_set(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

161
            /** @scrutinizer ignore-unhandled */ @ini_set('mbstring.internal_encoding', $charset);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
162
            // Ceci est requis pour que mb_convert_encoding() supprime les caractères invalides.
163
            // C'est utilisé par CI_Utf8, mais c'est aussi fait pour la cohérence avec iconv.
164
            mb_substitute_character('none');
165
        } else {
166
            define('MB_ENABLED', false);
167
        }
168
169
        // Il y a une constante ICONV_IMPL, mais le manuel PHP dit que l'utilisation
170
        // Les constantes prédéfinies d'iconv sont "fortement déconseillées".
171
        if (extension_loaded('iconv')) {
172
            define('ICONV_ENABLED', true);
173
            // iconv.internal_encoding est obsolète à partir de PHP 5.6
174
            // et son utilisation déclenche des messages E_DEPRECATED.
175
            @ini_set('iconv.internal_encoding', $charset);
176
        } else {
177
            define('ICONV_ENABLED', false);
178
        }
179
180
        define('UTF8_ENABLED', defined('PREG_BAD_UTF8_ERROR') && (ICONV_ENABLED === true || MB_ENABLED === true) && $charset === 'UTF-8');
181
    }
182
}
183