web-dev-qa-db-ja.com

PHPフレームワークで、なぜ「ルート」の概念が使用されるのですか?

PHPスクリプトがルートではないためですか?たとえば、article.phpがある場合、ルートは http:// mysite。 com/article.php

ルートが単純なファイルとして既に存在する場合、そのルートの概念をさらに抽象化するのはなぜですか?

31
Ryan

ルーターの機能を理解するには、まず書き換えエンジンとは何かを理解する必要があります。 Wikipediaの記事 (私の強調)から:

書き換えエンジンは、Web URLの外観を変更するソフトウェアです(URL書き換え)。書き換えられたURL(短い、派手なURL、または検索エンジンフレンドリー-SEFとも呼ばれます)を使用して、Webページへのより短く、より関連性の高いリンクを提供します。 この手法は、Webページの生成に使用されるファイルと、世界に提示されるURLとの間にある程度の分離を追加します

書き換えエンジンを使用する場合、URLとPHPスクリプトの間に1:1の相関関係はありません。同じ記事の例:

http://example.com/wiki/index.php?title=Page_title

次のように書き換えることができます。

http://example.com/wiki/Page_title

さまざまな利点 を使用する方法があります。 PHPは通常Apacheと密に結合されているため、最も一般的に使用される書き換えエンジンは Apacheのmod_rewrite です。

URLを書き換えたい場合は、何らかのルーティングが必要です。ルーティングとは、URLを取得してコンポーネントに分解し、呼び出す実際のスクリプトを決定するプロセスだからです。 Zend Frameworkの 標準ルーターのドキュメントページ は、プロセスを次のように説明しています。

ルーティングは、URIエンドポイント(ベースURLの後に来るURIの一部)を取得してパラメーターに分解し、どのモジュール、コントローラー、およびそのコントローラーのアクションが要求を受信するかを決定するプロセスです。

ほとんどのPHP現在のフレームワークは MVCパターン に基づいており、MVCフレームワークではプロセスは次のようになります*

  1. ブラウザがURLをポイントしている
  2. Webサーバーはリクエストをキャッチし、それを一般的なエントリポイント(通常はindex.phpスクリプト)に転送します。
  3. index.phpはURLを取得し、ルーティングプロセスを開始します。
  4. URLはパラメータに分解されます。最初はコントローラ、2番目はアクションメソッド、残りは動的パラメータと見なされます。
  5. 最初のパラメーターと一致するコントローラークラスが存在する場合、コントローラーオブジェクトがインスタンス化されます。
  6. 通常はコントローラーオブジェクトの関数であるアクションメソッドが呼び出され、その戻り値が実際にブラウザーに返されるものです。

パラメータをコントローラとメソッドに一致させるには、通常、ルートと呼ばれる複雑で動的なルーティングパターンを処理できるように 正規表現 による一致を使用します。ルートの良い例は CodeIgniterのURI Routingドキュメントページ にあります:

$ route ['journals'] = "ブログ";

$ route ['blog/joe'] = "blogs/users/34";

$ route ['product /(:any)'] = "catalog/product_lookup";

$ route ['product /(:num)'] = "catalog/product_lookup_by_id/$ 1";

$route配列は、パターンをキーとして保持し、結果のアクションをcontroller/action_method/dynamic_parameter形式の値として保持します。

*これは、正規プロセスの説明ではなく、単純化された説明です。

44
yannis