Repository navigation
Expand file tree
/
Copy pathbootstrap.php
More file actions
104 lines (87 loc) · 2.34 KB
/
Copy pathbootstrap.php
File metadata and controls
104 lines (87 loc) · 2.34 KB
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
<?php
require_once __DIR__ . '/vendor/autoload.php';
use App\Core\Container;
use App\Core\RateLimiter;
use App\Core\Request;
use App\Core\Router;
use App\Exception\BusinessRuleException;
use App\Exception\HttpException;
use App\Utility\Flash;
use App\Utility\JsonResponse;
use App\Utility\Template;
session_start();
// Constants
define('APP_ROOT', realpath(__DIR__));
// Global exception handler
set_exception_handler(function (\Throwable $exception) {
$status = 500;
$errors = NULL;
$message = "Internal Server Error";
if ($exception instanceof HttpException) {
$status = $exception->getStatusCode();
$message = $exception->getMessage();
}
elseif ($exception instanceof BusinessRuleException) {
$status = 422; // Unprocessable Entity
$message = $exception->getMessage();
$errors = $exception->getErrors(); // Retrieve detailed validation list
}
// If status is 500, log the error internally
if ($status >= 500) {
error_log($exception->getMessage() . PHP_EOL . $exception->getTraceAsString());
}
// Check if it's an API request (i.e., starts with /api/)
global $request;
$isApi = FALSE;
if (isset($request) && $request instanceof Request) {
if (str_starts_with($request->uri, '/api/')) {
$isApi = TRUE;
}
}
elseif (
isset($_SERVER['REQUEST_URI'])
&& str_starts_with($_SERVER['REQUEST_URI'], '/api/')
) {
$isApi = TRUE;
}
if ($isApi) {
$responsePayload = [
'ok' => FALSE,
'message' => $message,
];
if ($errors !== NULL) {
$responsePayload['errors'] = $errors;
}
$response = new JsonResponse($responsePayload, $status);
$response->send();
}
else {
new Template('status', [
'status' => $status,
'message' => $message,
'errors' => $errors,
], $status);
exit;
}
});
// Request
$request = new Request();
// Flash
$flash = new Flash();
// Container
$container = new Container();
$container->set(Container::class, $container);
$container->set(Request::class, $request);
$container->set(Flash::class, $flash);
// Router
$router = $container->get(Router::class);
$router->register();
// Resolve route
$response = $router->resolve($request->uri, $request->method);
if ($response instanceof JsonResponse) {
$response->send();
}
// Clear flash messages
$flash->deleteAll();
// Clear rate limits
RateLimiter::clearAllExpired();