Lors du développement d'applications Web, la fonction du système de routage est d'analyser l'URL demandée par l'utilisateur dans le contrôleur et la méthode correspondants. Bien que les cadres modernes (tels que Laravel et Symfony) aient des systèmes de routage puissants intégrés, dans le projet léger ou le stade d'apprentissage, nous pouvons également utiliser la fonction PARSE_URL qui vient avec PHP pour implémenter un mécanisme de distribution de routage simple.
Cet article présentera comment utiliser PARSE_URL et certaines fonctions de traitement de chaîne pour créer un système de résolution de routage URL simple.
PARSE_URL est une fonction intégrée dans PHP, qui est utilisée pour diviser les URL en composants, tels que le schéma, l'hôte, le chemin, la requête, etc. Les exemples sont les suivants:
$url = 'https://gitbox.net/user/profile?id=42';
$parts = parse_url($url);
print_r($parts);
Sortir:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /user/profile
[query] => id=42
)
Comme on peut le voir à partir de la sortie, parse_url peut nous aider à obtenir avec précision le chemin et la requête de l'URL, qui est la partie clé dont nous avons besoin pour implémenter la résolution de routage.
Créons un système de routage simple qui prend en charge les URL comme les suivants:
https://gitbox.net/controller/action/param1/param2
Nous espérons appeler la méthode correspondante en fonction des noms du contrôleur et de l'action et passer par les paramètres ultérieurs.
En supposant que notre application PHP est déployée sur un serveur qui prend en charge la réécriture d'URL, nous pouvons obtenir le chemin de demande actuel via $ _Server ['request_uri'] :
$requestUri = $_SERVER['REQUEST_URI'];
$path = parse_url($requestUri, PHP_URL_PATH);
// Retirez les objets de début et de fin,Et divisé par Slash
$segments = explode('/', trim($path, '/'));
$controller = !empty($segments[0]) ? ucfirst($segments[0]) . 'Controller' : 'HomeController';
$action = isset($segments[1]) ? $segments[1] : 'index';
$params = array_slice($segments, 2);
class UserController {
public function profile($id = null) {
echo "User profile page. ID: " . htmlspecialchars($id);
}
}
if (class_exists($controller)) {
$instance = new $controller();
if (method_exists($instance, $action)) {
call_user_func_array([$instance, $action], $params);
} else {
http_response_code(404);
echo "La méthode n'existe pas:$action";
}
} else {
http_response_code(404);
echo "Le contrôleur n'existe pas:$controller";
}
Supposons que nous accédons à l'adresse suivante:
https://gitbox.net/user/profile/42
La variable analysée sera:
$controller = 'UserController';
$action = 'profile';
$params = ['42'];
Sortir:
User profile page. ID: 42
En combinant la fonction PARSE_URL avec Explore et Call_User_Func_Array , nous pouvons rapidement créer un mécanisme de distribution de routage léger avec un code très simple. Bien qu'il ne puisse pas répondre aux besoins des applications complexes, il est suffisamment pratique pour apprendre et construire des interfaces API simples. Dans le développement ultérieur, la correspondance régulière, les paramètres par défaut, la gestion des erreurs et la prise en charge de l'espace de noms peuvent être ajoutés pour rendre le système plus parfait.