-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcore.php
114 lines (100 loc) · 4.16 KB
/
core.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
/**
* Copyright 2023-2024 Christophe LEMOINE
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the “Software”),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
declare(strict_types=1);
$configFile = __DIR__ . '/config.local.php';
if (!file_exists($configFile) || !is_readable($configFile)) {
$configFile = __DIR__ . '/config.php';
}
require_once $configFile;
require_once __DIR__ . '/functions.php';
$vendorAutoloader = __DIR__ . '/vendor';
if (is_dir($vendorAutoloader)) {
require_once $vendorAutoloader . '/autoload.php';
}
use components\core\Request;
use components\core\Route;
ini_set('default_charset', 'UTF-8');
ini_set('error_prepend_string', '<pre>');
ini_set('error_append_string', '</pre>');
ini_set('html_errors', true);
ini_set('log_errors', true);
ini_set('error_log', realpath(__DIR__ . 'error.log'));
ini_set('display_errors', DEBUG);
ini_set('display_startup_errors', DEBUG);
error_reporting(DEBUG ? E_ALL : E_ALL & ~E_DEPRECATED & ~E_STRICT);
$import = function (array $directories): void {
foreach ($directories as $directory) {
$dir = __DIR__ . DIRECTORY_SEPARATOR . $directory;
if (!is_dir($dir) || !is_readable($dir)) {
continue;
}
$requiredMethods = [];
// on recherche tous les fichiers à inclure
$subd = new \RecursiveDirectoryIterator(__DIR__ . DIRECTORY_SEPARATOR . $directory);
$iterator = new \RecursiveIteratorIterator($subd);
$files = new \RegexIterator($iterator, '/^.+\.(php|inc)$/i', RegexIterator::MATCH);
foreach ($files as $file) {
// inclut le fichier PHP
require_once $file->getPathname();
// recherche le nom complet de la classe dans le fichier inclut précédement
// puis recherche si la fonction statique __required est présente. Si oui, on mémorise
// la structure permettant de l'invoquer une fois tous les fichiers inclus.
try {
$className = get_classname_in_phpfile($file->getPathname());
$class = new ReflectionClass($className);
if ($class->hasMethod('__required')) {
$requiredMethods[] = [
'method' => $class->getMethod('__required'),
'class' => $class
];
}
} catch (\Exception $ex) {
}
}
// on appelle toutes les fonctions statiques __required trouvées dans les fichiers inclus
foreach ($requiredMethods as $obj) {
$obj['method']->invoke($obj['class']);
}
}
};
$import([
'components',
'middlewares',
'controllers'
]);
register_shutdown_function(
/**
* @throws ReflectionException
*/
function () {
header('X-Powered-By: ' . CORE_NAME . '/' . CORE_VERSION . ' (Php ' . PHP_VERSION . ')');
$currentRequest = Request::current();
$filepath = Route::isAsset($currentRequest);
if ($filepath !== false) {
Route::sendAsset($filepath);
} else {
list($request, $response) = Route::apply($currentRequest);
Route::sendResponse($request, $response);
}
}
);