Paaxio 1.0
Plateforme de streaming musical - SAE IUT Bayonne
Chargement...
Recherche...
Aucune correspondance
controller.class.php
Aller à la documentation de ce fichier.
1<?php
2
24{
28 private PDO $pdo;
29
33 private \Twig\Loader\FilesystemLoader $loader;
34
38 private \Twig\Environment $twig;
39
43 private ?array $get = null;
44
48 private ?array $post = null;
49
59 public function __construct(\Twig\Loader\FilesystemLoader $loader, \Twig\Environment $twig)
60 {
61 $db = bd::getInstance();
62 $this->pdo = $db->getConnexion();
63 $this->loader = $loader;
64 $this->twig = $twig;
65
66 // Récupération des variables GET et POST
67 if (isset($_GET) && !empty($_GET)) {
68 $this->get = $_GET;
69 }
70 if (isset($_POST) && !empty($_POST)) {
71 $this->post = $_POST;
72 }
73 $this->post = $_POST;
74 }
75
85 public function call(string $method): mixed
86 {
87 if (!method_exists($this, $method)) {
88 // Afficher une page 404 méthode non autorisée avec Twig
89 http_response_code(404);
90 $template = $this->getTwig()->load('errors/404.html.twig');
91 echo $template->render([
92 'page' => [
93 'title' => "Page non trouvée",
94 'name' => "error_404",
95 'description' => "La page ou la méthode demandée n'existe pas."
96 ]
97 ]);
98 exit;
99 } else {
100 return $this->$method();
101 }
102 }
103
108 public function getPDO(): ?PDO
109 {
110 return $this->pdo;
111 }
112
118 public function setPDO(?PDO $pdo): void
119 {
120 $this->pdo = $pdo;
121 }
122
127 public function getLoader(): ?\Twig\Loader\FilesystemLoader
128 {
129 return $this->loader;
130 }
131
137 public function setLoader(?\Twig\Loader\FilesystemLoader $loader): void
138 {
139 $this->loader = $loader;
140 }
141
146 public function getTwig(): ?\Twig\Environment
147 {
148 return $this->twig;
149 }
150
156 public function setTwig(?\Twig\Environment $twig): void
157 {
158 $this->twig = $twig;
159 }
160
165 public function getGet(): ?array
166 {
167 return $this->get;
168 }
169
175 public function setGet(?array $get): void
176 {
177 $this->get = $get;
178 }
179
184 public function getPost(): ?array
185 {
186 return $this->post;
187 }
188
194 public function setPost(?array $post): void
195 {
196 $this->post = $post;
197 }
198
210 protected function requireAuth(string $controller = '', string $method = '', array $params = []): void
211 {
212 if (!isset($_SESSION['user_logged_in']) || !$_SESSION['user_logged_in']) {
213 // Construction de l'URL de redirection
214 if (empty($controller) && empty($method)) {
215 // Si aucun paramètre n'est fourni, utiliser l'URL actuelle
216 $redirectUrl = $_SERVER['REQUEST_URI'] ?? '/';
217 } else {
218 // Construire l'URL à partir des paramètres fournis
219 $redirectParams = array_merge(['controller' => $controller, 'method' => $method], $params);
220 $redirectUrl = '/?' . http_build_query($redirectParams);
221 }
222
223 // Éviter l'injection d'URL - n'autorise que les chemins relatifs commençant par /
224 if (!empty($redirectUrl)) {
225 $redirectUrlDecoded = urldecode($redirectUrl);
226 if (strpos($redirectUrlDecoded, '://') !== false || (strlen($redirectUrlDecoded) > 0 && $redirectUrlDecoded[0] !== '/')) {
227 $redirectUrl = '/';
228 }
229 }
230
231 $redirectToEncoded = urlencode($redirectUrl);
232
233 // Redirection vers la page de connexion avec l'URL de retour
234 $this->redirectTo('home', 'connect', ['redirect' => $redirectToEncoded]);
235 }
236 }
237
247 protected function requireRole($requiredRole): void
248 {
249 $this->requireAuth();
250
251 // Récupérer le rôle en session
252 $sessionRole = $_SESSION['user_role'] ?? null;
253
254 // Si en session on a un Objet (Enum), on prend sa valeur. Sinon, on prend la string.
255 $userRoleValue = (is_object($sessionRole) && property_exists($sessionRole, 'value'))
256 ? $sessionRole->value
257 : $sessionRole;
258
259 // Récupérer la valeur du rôle requis (argument)
260 $requiredRoleValue = ($requiredRole instanceof RoleEnum)
261 ? $requiredRole->value
262 : $requiredRole;
263 $userRole = $_SESSION['user_role'] ?? null;
264 $userRoleValue = $userRole instanceof RoleEnum ? $userRole->value : $userRole;
265 $roleValue = $requiredRole instanceof RoleEnum ? $requiredRole->value : $requiredRole;
266
267 if ($userRoleValue !== $roleValue) {
268 http_response_code(403);
269 $template = $this->getTwig()->load('errors/403.html.twig');
270 echo $template->render([
271 'page' => [
272 'title' => "Erreur 403 - Accès refusé",
273 'name' => "403",
274 'description' => "Vous n'avez pas l'autorisation d'accéder à cette ressource."
275 ]
276 ]);
277 exit();
278 }
279 }
280
291 protected function redirectTo(string $controller, string $method, array $params = []): void
292 {
293 $query = [
294 'controller' => $controller,
295 'method' => $method
296 ];
297
298 if (!empty($params)) {
299 $query = array_merge($query, $params);
300 }
301
302 $queryString = http_build_query($query);
303 header('Location: /?' . $queryString);
304 exit();
305 }
306
314 protected function show405(): void
315 {
316 http_response_code(405);
317 $template = $this->getTwig()->load('errors/405.html.twig');
318 echo $template->render([
319 'page' => [
320 'title' => "Erreur 405 - Méthode non autorisée",
321 'name' => "405",
322 'description' => "La méthode HTTP utilisée n'est pas autorisée pour cette ressource."
323 ]
324 ]);
325 exit();
326 }
327
337 protected function requireAnyRole(array $allowedRoles): void
338 {
339 $this->requireAuth();
340
341 $userRole = $_SESSION['user_role'] ?? null;
342 $userRoleValue = $userRole instanceof RoleEnum ? $userRole->value : $userRole;
343 $allowedRoleValues = array_map(function ($role) {
344 return $role instanceof RoleEnum ? $role->value : $role;
345 }, $allowedRoles);
346
347 if (!in_array($userRoleValue, $allowedRoleValues, true)) {
348 http_response_code(403);
349 $template = $this->getTwig()->load('errors/403.html.twig');
350 echo $template->render([
351 'page' => [
352 'title' => "Erreur 403 - Accès refusé",
353 'name' => "403",
354 'description' => "Vous n'avez pas l'autorisation d'accéder à cette ressource."
355 ]
356 ]);
357 exit();
358 }
359 }
360}
RoleEnum
Énumération des rôles utilisateur.
Definition Role.enum.php:23
Classe de base pour tous les contrôleurs de l'application.
getPost()
Récupère les données POST.
call(string $method)
Appelle une méthode du contrôleur de façon dynamique.
Twig Environment $twig
__construct(\Twig\Loader\FilesystemLoader $loader, \Twig\Environment $twig)
Constructeur du contrôleur.
requireRole($requiredRole)
Exige que l'utilisateur ait un rôle spécifique.
setPDO(?PDO $pdo)
Définit la connexion PDO.
show405()
Affiche une erreur 405 Méthode non autorisée.
redirectTo(string $controller, string $method, array $params=[])
Redirige vers un contrôleur et une méthode donnés.
getGet()
Récupère les données GET.
requireAnyRole(array $allowedRoles)
Exige que l'utilisateur ait un des rôles spécifiés.
requireAuth(string $controller='', string $method='', array $params=[])
Exige que l'utilisateur soit authentifié.
setTwig(?\Twig\Environment $twig)
Définit l'environnement Twig.
getLoader()
Récupère le chargeur de templates Twig.
setPost(?array $post)
Définit les données POST.
setGet(?array $get)
Définit les données GET.
Twig Loader FilesystemLoader $loader
getPDO()
Récupère la connexion PDO.
setLoader(?\Twig\Loader\FilesystemLoader $loader)
Définit le chargeur de templates Twig.
getTwig()
Récupère l'environnement Twig.
static getInstance()
Retourne l'instance unique de la classe bd (pattern Singleton).
Definition bd.class.php:38