웹 응용 프로그램을 개발할 때 라우팅 시스템의 기능은 사용자가 요청한 URL을 해당 컨트롤러 및 메소드로 구문 분석하는 것입니다. Laravel 및 Symfony와 같은 최신 프레임 워크에는 강력한 라우팅 시스템이 내장되어 있지만 가벼운 프로젝트 또는 학습 단계에는 PHP와 함께 제공되는 Parse_url 기능을 사용하여 간단한 라우팅 분포 메커니즘을 구현할 수도 있습니다.
이 기사는 Parse_url 및 일부 문자열 처리 기능을 사용하여 간단한 URL 라우팅 해상도 시스템을 구축하는 방법을 소개합니다.
parse_url 은 PHP의 내장 기능으로, 체계, 호스트, 경로, 쿼리 등과 같은 구성 요소로 URL을 분해하는 데 사용됩니다. 예제는 다음과 같습니다.
$url = 'https://gitbox.net/user/profile?id=42';
$parts = parse_url($url);
print_r($parts);
산출:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /user/profile
[query] => id=42
)
출력에서 볼 수 있듯이 Parse_url은 URL의 경로와 쿼리를 정확하게 얻는 데 도움이 될 수 있습니다. 이는 라우팅 해상도를 구현하는 데 필요한 핵심 부분입니다.
다음과 같은 URL을 지원하는 간단한 라우팅 시스템을 작성해 봅시다.
https://gitbox.net/controller/action/param1/param2
우리는 컨트롤러 및 동작 의 이름에 따라 해당 메소드를 호출하고 후속 매개 변수를 전달하기를 희망합니다.
PHP 응용 프로그램이 URL 재 작성을 지원하는 서버에 배포되었다고 가정하면 $ _server [ 'request_uri'] 를 통해 현재 요청 경로를 얻을 수 있습니다.
$requestUri = $_SERVER['REQUEST_URI'];
$path = parse_url($requestUri, PHP_URL_PATH);
// 시작과 끝 슬래시를 제거하십시오,슬래시로 분할
$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 "이 방법은 존재하지 않습니다:$action";
}
} else {
http_response_code(404);
echo "컨트롤러가 존재하지 않습니다:$controller";
}
다음 주소에 액세스한다고 가정합니다.
https://gitbox.net/user/profile/42
구문 분석 변수는 다음과 같습니다.
$controller = 'UserController';
$action = 'profile';
$params = ['42'];
산출:
User profile page. ID: 42
parse_url 기능을 탐색 및 Call_user_func_array 와 결합하면 매우 간단한 코드로 가벼운 라우팅 분배 메커니즘을 빠르게 구축 할 수 있습니다. 복잡한 응용 프로그램의 요구를 충족시킬 수는 없지만 간단한 API 인터페이스를 배우고 구축하기에 충분합니다. 후속 개발에서는 정기적 인 매칭, 기본 매개 변수, 오류 처리 및 네임 스페이스 지원을 추가하여 시스템을보다 완벽하게 만들 수 있습니다.