ホームページ >php教程 >php手册 >PHP 擬似静的: PHP の単純な擬似静的 URL メカニズムの実装

PHP 擬似静的: PHP の単純な擬似静的 URL メカニズムの実装

WBOY
WBOYオリジナル
2016-06-21 08:51:361210ブラウズ

かつて、私たちの会社は新しいウェブサイト構築システムの開発を準備していましたが、以前のフレームワークを廃止し、新しいシステムの機能に適応する新しいフレームワークを開発することにしました。リーダーたちは外部の既存のフレームワークを利用することを望まず、独自のフレームワークを開発すると主張しています(開発を理解していないリーダーは人を殺します)。そこで私たちは新たな開発に投資しました。
私たちのシステムは疑似静的をサポートしているため、以前のシステムはサーバー Apache または iis に付属する書き換えファイルを直接使用してルールを定義していましたが、フレームワークにはルーティング メカニズムがないため、今回のフレームワークはPHP ルーティング メカニズムによって実装される新しい戦略。そこで私は関数の実装を検討し始めました。
開発の前に、まず「ルーティング メカニズム」が何をするのかを理解しました。主に 2 つのことを行います。
1. ルーティング メカニズムは、特定の形式の URL 構造からシステムの対応するパラメーターを抽出することです。たとえば、http://www.cxybl.com/article/1 のようになります。 /article/1 -> ?_m=article&id=1。
2. 次に、対応するパラメータを持つ URL が特定の形式の URL 構造に変換されます。これは、上記のプロセスの逆のプロセスです。ルーティング メカニズムは URL 構造とパラメーターの間の変換関係を分離するため、構造が将来変更されても、次のコードの実行には影響しません。
上記の理解により、ルーティング メカニズムを作成するにはいくつかの手順があると結論付けることができます。
1. サーバー Apache または iis に付属する書き換えファイルを作成し、URL 構造をindex.php にインポートします。
2. ルーティング ルール設定ファイル。
3. ルールの解析、URL の照合、変換に使用されるルーティング パーサー。
そこで、各部分を 1 つずつ実装していきました。
1. Apache を例として、ファイルの書き込みを書き換えます:

rewriteengine on
rewriterule ^index.php$ - [l]
rewritecond %{request_filename } !-f
rewritecond %{request_filename} !-d
rewriterule (.+)index.php/$1 [l]

上記のコードは URL をインポートするものです構造をインデックス .php に書き込むため、具体的な書き換えの詳細については説明しません。
2. PHP でルーティング ルール設定ファイル Routes.php を設定します。私は単純にハッシュ配列を使用してルールを記述しました:
/**
* ルーティング構成ファイルの作成手順:
* ルーティング構成は配列配列内にあり、1 つのレコードがルールを表します
* 配列キーのデータは一致するパス形式を表します: 特定の文字列を使用します識別子: '/{id}'
* 文字列には特定の変数を含めることができます。すべての変数は中括弧で囲まれています。{}
* 配列値は配列配列であり、配列内の変数に対して特定の処理を実行します。
* 変数は配列のキーに記述され、仕様は配列の値に記述されます (例: array('id'=>'/d+/','_m') =>'frontpage','_a'= >'index')
* 仕様は 2 つのカテゴリに分かれています:
* 1. 形式判定: 例: '/{id}'=>たとえば、array('id'=>'/d+/','_m '=>'frontpage','_a'=>'index') となります。ここで、'id'=>'/d+/' は形式判定、
* は id 変数が数値のみであることを意味します。形式判定後は正規表現のみが使用できます。PHP には正規クラスがないため、'/xxx/ の形式で文字列を指定します。 ' および '#xxx#' を正規表現として使用
* 2. デフォルトのパラメータ: '/ {id}'=> array('id'=>'/d+/','_m'=> など) 'frontpage','_a'=>'index') たとえば、'_m'=> ;'frontpage' がデフォルトのパラメータである
* は、前のパスには _m と _a の情報がないため、デフォルトのパラメータは、後で _m と _a の値として使用されます
*
* したがって、ルール '/{id}'=> array('id'=>'/d+/) ','_m'=>'フロントページ','_a'=>'インデックス')。 /3 を渡すと、システムはそれを index.php?_m=frontpage&_a=index&id=3
*
* に変換します。一致すると、ルールの一致は $routes 配列の順序に基づいて行われます。下位には一致しません。したがって、いくつかの特定の一致ルールを前面に配置し、一般的な一致ルールを背面に配置する必要があります。
* そうしないと、特定の一致ルールが実行されない可能性があります
*/
$routes= array('/' => array('_m'=>'wp_frontpage','_a'=>'index'),
'/{id}'=> '/d+/','_m'=>'wp_frontpage','_a'=>'index'),
'/{_m}/{_a}/{id}'=> id'=>'/d+/'),
'/{_m}/{_a}'=> array()
);
3. 最も複雑で重要なルーティング メカニズムの一部パーサーです。
パーサーは 2 つのクラスで構成されます (名前は悪いかもしれません)。
1 つはルートで、これはパーサー全体の外部インターフェイスであり、ルールの解析、URL の照合、変換に使用されます。ただし、これは単なるプロキシであり、実際の操作は直接実行されません。
1 つはルートパターンです。各ルートパターンインスタンスはルール配列内のレコードに対応し、ルートインスタンスには複数のルートパターンが含まれており、ルート内のすべてのオペレーションはすべての内部ルートパターンインスタンスオペレーションを呼び出して統合します。
クラスルート
{
プライベート static $instance = null;
プライベート $routepatterns=array();
プライベート関数 __construct()
{
$routes = array( );
ルートを含めます。"/routes.php";
foreach($routes as $key=>$value){
$this->routepatterns[]=new Routepattern($key,$value);
}
if(!isset($_server) ['path_info'])) return false;
$urlpath= $_server['path_info'];
$ismatch=$this->match_url($urlpath); 本文http://www.cxybl.com/html/wlbc/Php/20120607/28511.html



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。