PHPの高速ルーティング

画像

.htaccessファイルでのルーティングの使用から離れて、まずindex.phpの標準的な方向に行きました。そこでURLを解析し、対応するコントローラーを呼び出しました。この手法には長い間満足していました。 しかし、私は最近、自分が何か間違ったことをしていることに気付きました。

次に、XMLを使用してルールを保存し、シリアル化された外観を使用するルーティングについて説明します。



インデックスファイルのチェックインから離れて、そもそもそのような構造を取り除きたいと思いました。

if ($url[1] == 'news'){}
      
      







ほとんどのフレームワークで提供されているデザインを実際に使用したくありませんでした。通常、次のようになります。



 $route->addRule( '/news/{id}/', array( 'controler' = 'news', 'action' = 'showOne' ) );
      
      







最初は、ルーティングルールをJSONまたはXMLで保存したかった。

ただし、毎回ファイルを解析することはお勧めできません。このタイプは、静的ナビゲーションまたはフォーム/コントローラー/アクション/のナビゲーションにより適しています。

ルーティングをより柔軟に構成したかったため、最終的にXMLを使用してルールを保存し、ファイルを解析してルールの配列を作成した後、ファイルにシリアル化します(後で設定を取得するために使用します)

ルーティングXMLファイルは次のようになります。



 <root> <routes> <route match="exit" controller="user" action="exit" /> <route match="secret" controller="error" action="404"> <route match="love" controller="secret" action="love" /> </route> <route match="user" controller="user" action="list"> <route controller="user" action="user" match="{login}"> <route match="comments" controller="user" action="comments" /> <route match="wall" controller="user" action="wall" /> </route> </route> </routes> </root>
      
      







ルールの構造は次のとおりです

XMLルール要素は/ root / routes要素に含まれています。ルール要素には次の属性が含まれている必要があります。

match-URLによる検索に使用

コントローラー-呼び出されたコントローラー

action-呼び出されたメソッド



matchには静的データ(「secret」など)と動的「page- {page | num}」の両方を含めることができます。

変数でそのタイプを指定できます。

{param1 | num}-param1が数値の場合にのみ一致します

{param2 | str}-param2に文字と数字のみが含まれる場合にのみ一致します



XMLに基づいて、静的ルールと動的ルールを分離する配列が形成されます。

すべての子孫も静的と動的に分けられます。

/ root / system要素でも

次のデータが保存されます。

  <route match="index" controller="index" action="index" /> <route match="not_found" controller="error" action="404" />
      
      





したがって、ルーティングのルールに従って一致するものが見つからない場合、404エラーが返されます。空のURLの場合、そのインデックス値



使用方法は次のようになります。



 $result = $router->get('/secret/love/');
      
      





結果は次のようになります。

 Array ( [controller] => secret [action] => love [values] => Array ( ) )
      
      







 $result = $router->get('/user/Testik/wall/');
      
      







 Array ( [controller] => user [action] => wall [values] => Array ( [login] => Testik ) )
      
      







BitBucketのソース

ダウンロードzip gz bz2



All Articles