J'ai une classe Router avec une fonction route() :
public function route($url)
{
foreach ($this->routes as $route => $params) {
// Remplace les annotations dans la route par des regex
$pattern = '#^' . preg_replace('#\{([\w]+)\}#', '([^/]+)', $route) . '$#';
if (preg_match($pattern, $url, $matches)) {
// Supprime le premier élément qui contient l'URL complète
array_shift($matches);
// Appelle la méthode du contrôleur avec les paramètres
list($controllerClass, $action) = $params;
$controller = new $controllerClass();
// Rendre la vue en utilisant Twig
echo $this->twig->render($action . '.twig', $controller->$action(...$matches));
return;
}
}
// Si aucune route n'est trouvée, affiche la page 404
echo $this->twig->render('404.twig');
}
}
Pour info,
$this->routes
Me retourne bien le résultat attendu.
Toutefois, j'ai un problème que je ne comprend pas : malgré que
$pattern (#^GET /$#) soit égal à $url (#^GET /$#) la condition
if (preg_match($pattern, $url, $matches))
n'est pas valide. Par conséquent, le code de la condition ne d'effectue pas
le problème doit donc venir de mon fichier index.php
$router = new Router($routes);
// Récupération de l'URL demandée
$url = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);
// Supprime la partie de l'URL après le point d'interrogation (si présente)
$url = strtok($url, '?');
// Routage de la demande vers le bon contrôleur et l'action correspondante
$router->route($url);
lors de la construction de $url. non ?
Mais même $url devrait être égal à '/' pour étant donné que je veux aller sur le lien
Gérer (configurable) le fait qu'il puisse ne pas l'être, ainsi tu rajoutes le chemin de base de ton application en préfixe au pattern qui doit être matché
De la même manière que tu définis tes paramètres de connexion à la base de données ?
Par contre avec la façon dont tu définis tes routes, tu ne peux pas simplement la concaténer (et je l'ajouterais dynamiquement quand je cherche la route plutôt que de le faire à leurs définitions). Il faudrait un preg_replace ?
$http_root_directory = '/monsite/'; # à chercher dans ta "configuration"
$route = preg_replace('~/~', $http_root_directory, $route, 1);
# ... (la suite/ton autre preg_replace)
Ou alors, le soustraire de $url :
$http_root_directory = '/monsite/'; # à chercher dans ta "configuration"
$url = substr_replace($_SERVER['REQUEST_URI'], '/', 0, strlen($http_root_directory));
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli