MVCRouterクラス (より広範なFront Controllerの一部) は、HTTP 要求の URL、特にパス コンポーネント (および場合によってはクエリ文字列) を分解します。
はRouter、パス コンポーネントの最初の 1 つまたは 2 つの部分を、対応するルートの組み合わせ ( Controller/ アクション [メソッド]、またはControllerデフォルト アクションを実行するもの (メソッド) のみ) と一致させようとします。
アクションまたはコマンドは、特定のController.
通常、Web ページごとに 1 つ以上abstract Controllerの の子が存在します (一般的に言えば)。Controller
URL に引数が存在する場合、Routerは目的の のメソッドにも引数を渡すと言う人もいるかもしれません。Controller
注: オブジェクト指向プログラミングの純粋主義者は、単一責任の原則に従い、URL のコンポーネントのルーティングとクラスのディスパッチは2 つの別個の責任であると主張するかもしれません。Controllerその場合、Dispatcherクラスは実際に をインスタンス化し、Controllerそのメソッドの 1 つにクライアント HTTP 要求から派生した引数を渡します。
例 1:Controllerが、アクションも引数もありません。
http://localhost/contactGET 要求では、フォームが表示される場合があります。
コントローラー= 契約
アクション= デフォルト (通常はindex()メソッド)
======================
例 2:Controllerアクションはありますが、引数はありません。
http://localhost/contact/sendPOST 要求では、これによりサーバー側の検証が開始され、メッセージの送信が試行される場合があります。
コントローラー= 契約
アクション= 送信
======================
例 3: Controller、アクション、および引数。
http://localhost/contact/send/syncPOST 要求では、これによりサーバー側の検証が開始され、メッセージの送信が試行される場合があります。ただし、この場合、JavaScript がアクティブになっていない可能性があります。したがって、グレースフル デグラデーションをサポートするには、画面の再描画をサポートし、 の代わりに ,の HTTP ヘッダーで応答するContactControllerを使用するように に指示できます。に引数として渡されます。私の例は完全に恣意的で作り話でしたが、私はそれが法案に合っていると思いました!ViewContent-Type: text/htmlContent-Type: application/jsonsyncContactConroller::send()sync
コントローラー= 契約
アクション= 送信
Arguments = [sync] // はい、配列で引数を渡します!
クラスは、要求されたRouter具体的な子をインスタンス化し、要求されたメソッドをコントローラー インスタンスからController呼び出し、コントローラー メソッドにその引数(存在する場合) を渡します。
1)クラスRouterはまず、インスタンス化できる具象があるかどうかを確認する必要がありControllerます (URL にある名前と「Controller」という単語を使用)。コントローラーが見つかった場合は、要求されたメソッド(アクション) の存在をテストします。
2)具体的な子をインスタンス化するためRouterに実行時に必要な PHP を見つけてロードできない場合(オートローダーを使用することをお勧めします)、配列 (通常Controllerは別のクラス名で見つかりますRoute) をチェックして、要求された URL が一致するかどうかを確認する必要があります。式、それに含まれる要素のいずれか。Routeクラスの基本的なスケルトンは次のとおりです。
注: .*?= 0 個以上の任意の文字、非キャプチャ。
class Route
{
private $routes = [
['url' => 'nieuws/economie/.*?', // regular expression.
'controller' => 'news',
'action' => 'economie'],
['url' => 'weerbericht/locatie/.*?', // regular expression.
'controller' => 'weather',
'action' => 'location']
];
public function __contstruct()
{
}
public function getRoutes()
{
return $this->routes;
}
}
正規表現を使用する理由 URL の 2 番目のスラッシュの後のデータについては、信頼できる照合が行われる可能性は低くなります。
/controller/method/param1/param2/...ここで、param[x] は何でもかまいません!
警告:ターゲティング データにパターン区切り文字 (この場合はスラッシュ「/」) が含まれている場合は、デフォルトの正規表現パターン区切り文字 (「/」) を変更することをお勧めします。ほとんどの無効な URL 文字は適切な選択です。
クラスのメソッドは配列をRouter繰り返し処理して、ターゲット URL と第 2 レベルのインデックスに関連付けられた値Route::routesの間に正規表現の一致があるかどうかを確認します。一致するものが見つかった場合、インスタンス化する具象と、その後に呼び出すメソッドを then が認識します。引数は、必要に応じてメソッドに渡されます。string urlRouterController
以下を表す URL など、エッジ ケースには常に注意してください。
`/` // Should take you to the home page / HomeController by default
`''` // Should take you to the home page / HomeController by default
`/gibberish&^&*^&*%#&(*$%&*#` // Reject