ホームページ  >  記事  >  バックエンド開発  >  PHP で単純な疑似静的 URL を実装するメカニズムの紹介

PHP で単純な疑似静的 URL を実装するメカニズムの紹介

WBOY
WBOYオリジナル
2016-07-25 09:05:301274ブラウズ
  1. RewriteEngine On
  2. RewriteRule ^index.php$ - [L]
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRルール (.+) Index.php/$1 [L]
コードをコピー

上記のコードは、URL 構造を Index.php にインポートするものです。具体的な書き換えの詳細については詳しく説明しません。

2. PHP でルーティング ルール設定ファイル Routes.php を設定します。ルールを記述するために単純にハッシュ配列を使用しました。

  1. /**
  2. * ルーティング構成ファイルの作成手順:
  3. * ルーティング構成は配列配列内にあり、1 つのレコードがルールを表します
  4. * 配列キーのデータは一致するパス形式を表します: '/{ などの特定の文字列識別子を使用します。 id}'
  5. * 文字列には特定の変数を含めることができ、すべての変数は中かっこ {} で囲まれます
  6. * 配列値は配列配列であり、キー内のパス内の変数に対して特定の処理を実行します
  7. * 変数は次のように記述されます配列のキー。仕様は、array('id'=>'/d+/','_m'=>'frontpage','_a'=> のように配列の値に記述されます。 'index')
  8. * 仕様は 2 つのカテゴリに分かれています:
  9. * 1. 形式判定: 例: '/{id}'=> array('id'=>'/d+/','_m' =>'frontpage','_a'=>'index ')、たとえば、'id'=>'/d+/' は形式判定です。
  10. * は id 変数が数値のみであることを意味します。 PHPには正規クラスがないため、正規表現として「/XXX/」と「#XXX#」の形式の文字列を指定します
  11. * 2. デフォルトパラメータ:例: '/{id}'=> array('id'=>'/d+/' ,'_m'=>'frontpage','_a'=>'index')、ここで ' _m'=>'frontpage' はデフォルトのパラメータです
  12. * 前のパスには _m と _a の情報がないため、デフォルトのパラメータは後で _m と _a の値として使用されます
  13. *
  14. *ルール「/{id}」=> array('id'=>'/d+/','_m' =>'frontpage','_a'=>'index') の場合。 /3 を渡すと、システムはそれをindex.php?_m=frontpage&_a=index&id=3 に変換します
  15. *
  16. * 一致するルールは、$routes 配列の順序で 1 つずつ一致することです。下位にはマッチングされません。したがって、いくつかの特定の一致ルールを前面に配置し、一般的な一致ルールを背面に配置する必要があります。
  17. * そうしないと、特定のマッチングルールが実行されない可能性があります
  18. */
  19. $routes= array(
  20. '/' => array('_m'=>'wp_frontpage','_a'=>'index'),
  21. '/{id}'=> 配列('id'=>'/d+/','_m'=>'wp_frontpage','_a'=>'index'),
  22. '/{_m }/{_a}/{id}'=> 配列('id'=>'/d+/')、
  23. '/{_m}/{_a}'=>
)
コードをコピー

3. ルーティング メカニズムの最も複雑かつ重要な部分はパーサーです。 パーサーは 2 つのクラス (おそらく名前が適切ではありません) で構成されます。 1 つは Route で、これはパーサー全体の外部インターフェイスであり、ルールの解析、URL の照合、変換に使用されます。ただし、これは単なるプロキシであり、実際の操作は直接実行されません。 1 つは RoutePattern です。各 RoutePattern インスタンスは、ルール配列内のレコードに対応します。Route インスタンスには複数の RoutePattern が含まれており、Route 内のすべての操作はすべての内部 RoutePattern インスタンス操作を呼び出して統合します。

    クラス Route
  1. {
  2. private static $instance = null;
  3. private function __construct()
  4. {
  5. $routes = array(); Routes.php";
  6. foreach($routes as $key=>$value){
  7. $this->routepatterns[]=new RoutePattern($key,$value);
  8. }
  9. if(!isset($ _SERVER['PATH_INFO'])) false を返します。
  10. $urlpath= $_SERVER['PATH_INFO'];
  11. $strip_urlpath=str_replace('/','') ,$urlpath);
  12. if(!$ismatch&&!empty($strip_urlpath)){
  13. Content::redirect(PAGE_404);
  14. /**
  15. * ルーティング ルールを使用して、対応する URL アドレスを照合します。 照合が成功した場合は、対応する URL パラメーターを $_GET に入力します
  16. * @param string URL アドレス
  17. * @return bool 照合が成功したかどうか
  18. */
  19. パブリック関数 match_url($urlpath) {
  20. foreach($this->routepatterns as $router){
  21. $urlargs=$router->match_url($urlpath);
  22. if($urlargs!==false){
  23. $_GET=array_merge($urlargs, $_GET);
  24. true を返す
  25. }
  26. }
  27. false を返す }
  28. public function rewrite_url($urlparams){
  29. foreach($this->routepatterns as $router){
  30. $urlstr=$router-> ;rewrite_url($urlparams);
  31. if($urlstr!==false){
  32. $urlstr; }
  33. }
  34. $actualparams=array();
  35. foreach($arg=>$val){
  36. $actualparams[]=$arg."=".urlencode($val);
  37. $actualparamstr=implode('&', $actualparams);
  38. $rewriteurl="/index.php"; emptyempty($rewriteurl))$rewriteurl.="?{$actualparamstr}";
  39. return $rewriteurl;
  40. public static function init()
  41. {
  42. if (null == self::$instance) {
  43. self ::$instance = new Route();
  44. }
  45. return self::$instance; }
  46. }
  47. class RoutePattern{
  48. //...
  49. }
  50. ルーティングについてRoutePattern のルール解析、URL マッチング、URL 変換の詳細については、スペースとエネルギーが限られているため、今日は詳しく説明しません。次に詳しく分析します。時間。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。