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 // Utiliser site_administrateur si l'utilisateur connecté est admin, sinon site_user (public)
63 $role = bd::ROLE_SITE_USER;
64 if (!empty($_SESSION['user_logged_in']) && isset($_SESSION['user_role'])) {
65 $sessionRole = $_SESSION['user_role'];
66 $userRoleValue = $sessionRole instanceof RoleEnum ? $sessionRole->value : $sessionRole;
67 if ($userRoleValue === RoleEnum::Admin->value) {
69 }
70 }
71 $this->pdo = $db->getConnexion($role);
72 $this->loader = $loader;
73 $this->twig = $twig;
74
75 // Récupération des variables GET et POST
76 if (isset($_GET) && !empty($_GET)) {
77 $this->get = $_GET;
78 }
79 if (isset($_POST) && !empty($_POST)) {
80 $this->post = $_POST;
81 }
82 $this->post = $_POST;
83
84 // Expose global Twig variable pour le nombre de messages non lus
85 if (!empty($_SESSION['user_logged_in']) && !empty($_SESSION['user_email'])) {
86 try {
87 $messageDAO = new MessageDAO($this->pdo);
88 $unreadCount = $messageDAO->getUnreadCountForUser($_SESSION['user_email']);
89 $this->twig->addGlobal('unreadMessagesCount', $unreadCount);
90 } catch (\Throwable $e) {
91 }
92 }
93 }
94
104 public function call(string $method): mixed
105 {
106 if (!method_exists($this, $method)) {
107 // Afficher une page 404 méthode non autorisée avec Twig
108 http_response_code(404);
109 $template = $this->getTwig()->load('errors/404.html.twig');
110 echo $template->render([
111 'page' => [
112 'title' => "Page non trouvée",
113 'name' => "error_404",
114 'description' => "La page ou la méthode demandée n'existe pas."
115 ]
116 ]);
117 exit;
118 } else {
119 return $this->$method();
120 }
121 }
122
127 public function getPDO(): ?PDO
128 {
129 return $this->pdo;
130 }
131
137 public function setPDO(?PDO $pdo): void
138 {
139 $this->pdo = $pdo;
140 }
141
146 public function getLoader(): ?\Twig\Loader\FilesystemLoader
147 {
148 return $this->loader;
149 }
150
156 public function setLoader(?\Twig\Loader\FilesystemLoader $loader): void
157 {
158 $this->loader = $loader;
159 }
160
165 public function getTwig(): ?\Twig\Environment
166 {
167 return $this->twig;
168 }
169
175 public function setTwig(?\Twig\Environment $twig): void
176 {
177 $this->twig = $twig;
178 }
179
184 public function getGet(): ?array
185 {
186 return $this->get;
187 }
188
194 public function setGet(?array $get): void
195 {
196 $this->get = $get;
197 }
198
203 public function getPost(): ?array
204 {
205 return $this->post;
206 }
207
213 public function setPost(?array $post): void
214 {
215 $this->post = $post;
216 }
217
229 protected function requireAuth(string $controller = '', string $method = '', array $params = []): void
230 {
231 if (!isset($_SESSION['user_logged_in']) || !$_SESSION['user_logged_in']) {
232 // Construction de l'URL de redirection
233 if (empty($controller) && empty($method)) {
234 // Si aucun paramètre n'est fourni, utiliser l'URL actuelle
235 $redirectUrl = $_SERVER['REQUEST_URI'] ?? '/';
236 } else {
237 // Construire l'URL à partir des paramètres fournis
238 $redirectParams = array_merge(['controller' => $controller, 'method' => $method], $params);
239 $redirectUrl = '/?' . http_build_query($redirectParams);
240 }
241
242 // Éviter l'injection d'URL - n'autorise que les chemins relatifs commençant par /
243 if (!empty($redirectUrl)) {
244 $redirectUrlDecoded = urldecode($redirectUrl);
245 if (strpos($redirectUrlDecoded, '://') !== false || (strlen($redirectUrlDecoded) > 0 && $redirectUrlDecoded[0] !== '/')) {
246 $redirectUrl = '/';
247 }
248 }
249
250 $redirectToEncoded = urlencode($redirectUrl);
251
252 // Redirection vers la page de connexion avec l'URL de retour
253 $this->redirectTo('home', 'connect', ['redirect' => $redirectToEncoded]);
254 }
255 }
256
266 protected function requireRole($requiredRole): void
267 {
268 $this->requireAuth();
269
270 // Récupérer le rôle en session
271 $sessionRole = $_SESSION['user_role'] ?? null;
272
273 // Si en session on a un Objet (Enum), on prend sa valeur. Sinon, on prend la string.
274 $userRoleValue = (is_object($sessionRole) && property_exists($sessionRole, 'value'))
275 ? $sessionRole->value
276 : $sessionRole;
277
278 // Récupérer la valeur du rôle requis (argument)
279 $userRole = $_SESSION['user_role'] ?? null;
280 $userRoleValue = $userRole instanceof RoleEnum ? $userRole->value : $userRole;
281 $roleValue = $requiredRole instanceof RoleEnum ? $requiredRole->value : $requiredRole;
282
283 if ($userRoleValue !== $roleValue) {
284 http_response_code(403);
285 $template = $this->getTwig()->load('errors/403.html.twig');
286 echo $template->render([
287 'page' => [
288 'title' => "Erreur 403 - Accès refusé",
289 'name' => "403",
290 'description' => "Vous n'avez pas l'autorisation d'accéder à cette ressource."
291 ]
292 ]);
293 exit();
294 }
295 }
296
307 protected function redirectTo(string $controller, string $method, array $params = []): void
308 {
309 $query = [
310 'controller' => $controller,
311 'method' => $method
312 ];
313
314 if (!empty($params)) {
315 $query = array_merge($query, $params);
316 }
317
318 $queryString = http_build_query($query);
319 header('Location: /?' . $queryString);
320 exit();
321 }
322
330 protected function show405(): void
331 {
332 http_response_code(405);
333 $template = $this->getTwig()->load('errors/405.html.twig');
334 echo $template->render([
335 'page' => [
336 'title' => "Erreur 405 - Méthode non autorisée",
337 'name' => "405",
338 'description' => "La méthode HTTP utilisée n'est pas autorisée pour cette ressource."
339 ]
340 ]);
341 exit();
342 }
343
353 protected function requireAnyRole(array $allowedRoles): void
354 {
355 $this->requireAuth();
356
357 $userRole = $_SESSION['user_role'] ?? null;
358 $userRoleValue = $userRole instanceof RoleEnum ? $userRole->value : $userRole;
359 $allowedRoleValues = array_map(function ($role) {
360 return $role instanceof RoleEnum ? $role->value : $role;
361 }, $allowedRoles);
362
363 if (!in_array($userRoleValue, $allowedRoleValues, true)) {
364 http_response_code(403);
365 $template = $this->getTwig()->load('errors/403.html.twig');
366 echo $template->render([
367 'page' => [
368 'title' => "Erreur 403 - Accès refusé",
369 'name' => "403",
370 'description' => "Vous n'avez pas l'autorisation d'accéder à cette ressource."
371 ]
372 ]);
373 exit();
374 }
375 }
376}
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.
const ROLE_SITE_USER
Definition bd.class.php:15
const ROLE_SITE_ADMINISTRATEUR
Definition bd.class.php:16
static getInstance()
Retourne l'instance unique de la classe bd (pattern Singleton).
Definition bd.class.php:52