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/contact
GET 要求では、フォームが表示される場合があります。
コントローラー= 契約
アクション= デフォルト (通常はindex()
メソッド)
======================
例 2:Controller
アクションはありますが、引数はありません。
http://localhost/contact/send
POST 要求では、これによりサーバー側の検証が開始され、メッセージの送信が試行される場合があります。
コントローラー= 契約
アクション= 送信
======================
例 3: Controller
、アクション、および引数。
http://localhost/contact/send/sync
POST 要求では、これによりサーバー側の検証が開始され、メッセージの送信が試行される場合があります。ただし、この場合、JavaScript がアクティブになっていない可能性があります。したがって、グレースフル デグラデーションをサポートするには、画面の再描画をサポートし、 の代わりに ,の HTTP ヘッダーで応答するContactController
を使用するように に指示できます。に引数として渡されます。私の例は完全に恣意的で作り話でしたが、私はそれが法案に合っていると思いました!View
Content-Type: text/html
Content-Type: application/json
sync
ContactConroller::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
url
Router
Controller
以下を表す URL など、エッジ ケースには常に注意してください。
`/` // Should take you to the home page / HomeController by default
`''` // Should take you to the home page / HomeController by default
`/gibberish&^&*^&*%#&(*$%&*#` // Reject