Webアプリケーションを開発する場合、ルーティングシステムの機能は、ユーザーがリクエストしたURLを対応するコントローラーとメソッドに解析することです。最新のフレームワーク(LaravelやSymfonyなど)には、軽量プロジェクトや学習段階で組み込みの強力なルーティングシステムがありますが、PHPに付属するPARSE_URL関数を使用して、単純なルーティング配信メカニズムを実装することもできます。
この記事では、 parse_urlといくつかの文字列処理関数を使用して、単純なURLルーティング解像度システムを構築する方法を紹介します。
Parse_urlは、PHPの組み込み関数であり、Scheme、Host、Path、クエリなどのコンポーネントに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関数とExploreおよびcall_user_func_arrayを組み合わせることにより、非常に単純なコードで軽量ルーティング配信メカニズムをすばやく構築できます。複雑なアプリケーションのニーズを満たすことはできませんが、簡単なAPIインターフェイスを学習および構築するのに十分実用的です。その後の開発では、定期的なマッチング、デフォルトのパラメーター、エラー処理、名前空間サポートをさらに追加して、システムをより完全にすることができます。