Passed
Push — main ( cd5116...99c066 )
by Dimitri
12:52
created

App::core()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 1
cp 0
crap 2
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\Http\Uri;
15
use BlitzPHP\Utilities\Helpers;
16
use InvalidArgumentException;
17
18
/**
19
 * Il est responsable de l'emplacement des ressources et de la gestion des chemins.
20
 *
21
 * ### Ajout de chemins
22
 *
23
 * Des chemins supplémentaires pour les modèles et les plugins sont configurés avec Configurer maintenant. Voir config/app.php pour un
24
 * Exemple. Les variables `App.paths.plugins` et `App.paths.templates` sont utilisées pour configurer les chemins des plugins
25
 * et modèles respectivement. Toutes les ressources basées sur les classes doivent être mappées à l'aide du chargeur automatique de votre application.
26
 *
27
 * ### Inspecter les chemins chargés
28
 *
29
 * Vous pouvez inspecter les chemins actuellement chargés en utilisant `App::classPath('Controller')` par exemple pour voir les chemins chargés
30
 * chemins de contrôleur.
31
 *
32
 * Il est également possible d'inspecter les chemins des classes de plugins, par exemple, pour obtenir
33
 * le chemin vers les assistants d'un plugin que vous appelleriez `App::classPath('View/Helper', 'MyPlugin')`
34
 *
35
 * ### Localisation des plugins
36
 *
37
 * Les plugins peuvent également être localisés avec l'application. Utiliser Plugin::path('DebugKit') par exemple,
38
 * vous donne le chemin complet vers le plugin DebugKit.
39
 *
40
 * @creadit <a href="https://book.cakephp.org/4/en/core-libraries/app.html">CakePHP - Cake\Core\App</a>
41
 */
42
class App
43
{
44
    /**
45
     * Renvoie le nom de la classe dans le namespace. Cette méthode vérifie si la classe est définie sur le
46
     * application/plugin, sinon essayez de charger depuis le noyau de BlitzPHP
47
     *
48
     * @param string $type Type de la classe
49
     *
50
     * @return string|null Nom de classe avec le namespace, null si la classe est introuvable.
51
     * @psalm-return class-string|null
52
     */
53
    public static function className(string $class, string $type = '', string $suffix = ''): ?string
54
    {
55
        if (str_contains($class, '\\')) {
56
            return class_exists($class) ? $class : null;
57
        }
58
59
        [$plugin, $name] = Helpers::pluginSplit($class);
60
        $fullname        = '\\' . str_replace('/', '\\', $type . '\\' . $name) . $suffix;
61
62
        $base = $plugin ?: APP_NAMESPACE;
63
        if ($base !== null) {
64
            $base = str_replace('/', '\\', rtrim($base, '\\'));
65
66
            if (static::_classExistsInBase($fullname, $base)) {
67
                /** @var class-string */
68
                return $base . $fullname;
69
            }
70
        }
71
72
        if ($plugin || ! static::_classExistsInBase($fullname, 'BlitzPHP')) {
73
            return null;
74
        }
75
76
        /** @var class-string */
77
        return 'BlitzPHP' . $fullname;
78
    }
79
80
    /**
81
     * Renvoie le nom de division du plugin d'une classe
82
     *
83
     * Exemples:
84
     *
85
     * ```
86
     * App::shortName(
87
     *     'SomeVendor\SomePlugin\Controller\Component\TestComponent',
88
     *     'Controller/Component',
89
     *     'Component'
90
     * )
91
     * ```
92
     *
93
     * Returns: SomeVendor/SomePlugin.Test
94
     *
95
     * ```
96
     * App::shortName(
97
     *     'SomeVendor\SomePlugin\Controller\Component\Subfolder\TestComponent',
98
     *     'Controller/Component',
99
     *     'Component'
100
     * )
101
     * ```
102
     *
103
     * Returns: SomeVendor/SomePlugin.Subfolder/Test
104
     *
105
     * ```
106
     * App::shortName(
107
     *     'Cake\Controller\Component\AuthComponent',
108
     *     'Controller/Component',
109
     *     'Component'
110
     * )
111
     * ```
112
     *
113
     * Returns: Auth
114
     *
115
     * @param string $type Type de la classe
116
     *
117
     * @return string Plugin split name of class
118
     */
119
    public static function shortName(string $class, string $type, string $suffix = ''): string
120
    {
121
        $class = str_replace('\\', '/', $class);
122
        $type  = '/' . $type . '/';
123
124
        $pos = strrpos($class, $type);
125
        if ($pos === false) {
126
            return $class;
127
        }
128
129
        $pluginName = (string) substr($class, 0, $pos);
130
        $name       = (string) substr($class, $pos + strlen($type));
131
132
        if ($suffix) {
133
            $name = (string) substr($name, 0, -strlen($suffix));
134
        }
135
136
        $nonPluginNamespaces = [
137
            'BlitzPHP',
138
            str_replace('\\', '/', APP_NAMESPACE),
139
        ];
140
        if (in_array($pluginName, $nonPluginNamespaces, true)) {
141
            return $name;
142
        }
143
144
        return $pluginName . '.' . $name;
145
    }
146
147
    /**
148
     * _classExistsInBase
149
     *
150
     * Enveloppe d'isolation de test
151
     */
152
    protected static function _classExistsInBase(string $classname, string $namespace): bool
153
    {
154
        return class_exists($namespace . $classname);
155
    }
156
157
    /**
158
     * Renvoie le chemin complet vers un paquet à l'intérieur du noyau BlitzPHP
159
     *
160
     * Usage:
161
     *
162
     * ```
163
     * App::core('Cache/Engine');
164
     * ```
165
     *
166
     * Retournera le chemin complet vers le package des moteurs de cache.
167
     *
168
     * @param string $type Package type.
169
     *
170
     * @return string[] Chemin d'accès complet au package
171
     */
172
    public static function core(string $type): array
173
    {
174
        return [SYST_PATH . str_replace('/', DIRECTORY_SEPARATOR, $type) . DIRECTORY_SEPARATOR];
175
    }
176
177
    /**
178
     * Utilisé par les autres fonctions d'URL pour construire un
179
     * URI spécifique au framework basé sur la configuration de l'application.
180
     *
181
     * @internal En dehors du framework, ceci ne doit pas être utilisé directement.
182
     *
183
     * @param string $relativePath Peut inclure des requêtes ou des fragments
184
     *
185
     * @throws InvalidArgumentException Pour les chemins ou la configuration non valides
186
     */
187
    public static function getUri(string $relativePath = ''): Uri
188
    {
189 6
        $config = (object) config('app');
190
191
        if ($config->base_url === '') {
192 6
            throw new InvalidArgumentException(__METHOD__ . ' requires a valid baseURL.');
193
        }
194
195
        // Si un URI complet a été passé, convertissez-le
196
        if (is_int(strpos($relativePath, '://'))) {
197 6
            $full         = new Uri($relativePath);
198
            $relativePath = Uri::createURIString(null, null, $full->getPath(), $full->getQuery(), $full->getFragment());
199
        }
200
201 6
        $relativePath = URI::removeDotSegments($relativePath);
202
203
        // Construire l'URL complète basée sur $config et $relativePath
204 6
        $url = rtrim($config->base_url, '/ ') . '/';
205
206
        // Recherche une page d'index
207
        if ($config->index_page !== '') {
208
            $url .= $config->index_page;
209
210
            // Vérifie si nous avons besoin d'un séparateur
211
            if ($relativePath !== '' && $relativePath[0] !== '/' && $relativePath[0] !== '?') {
212
                $url .= '/';
213
            }
214
        }
215
216 6
        $url .= $relativePath;
217
218 6
        $uri = new Uri($url);
219
220
        // Vérifie si le schéma baseURL doit être contraint dans sa version sécurisée
221
        if ($config->force_global_secure_requests && $uri->getScheme() === 'http') {
222 6
            $uri->setScheme('https');
223
        }
224
225 6
        return $uri;
226
    }
227
}
228