PHP フレームワーク Router.php 作成 (2)

2018年5月8日

皆さんこんにちは!タカモリです。

今回は前回説明しきれなかった、Router.phpの続きをやっていく。

ということで、一応srcを再度貼ってみる。

前回、compileRoutes()メソッドでは、今回行う正規表現の下準備みたいなものという話をしたと思う。つまり正規表現で扱える形に治したルーティング定義配列を使って、今回は正規表現を使っていくということだ。

まぁ特段難しいわけではないのだが、さっそく今回のメソッドについて話していきたいと思う(今日は前談を無しにしているのだが、実は最近文字数が多すぎて一回のブログに時間をかけすぎなのが悩みなのだ。。。)

・resolve()メソッド

このresolve()メソッドには、引数としてパスインフォが渡される。

パスインフォとは、urlのフロントコントローラーから後ろの部分だ。例えば「/」だとか、「/status/post」などである。

では、「/status/post」を引数として受けた場合の挙動について、簡単に上から順番に辿っていく。

「/status/post」を引数に受けたresolve()メソッドではまず、そのパスインフォの最初の文字列がスラッシュであるかを判定している。もしスラッシュがなかったとしたら、スラッシュを付け足すことになっているのだが、基本的にはスラッシュが付くはずなので、スラッシュがつかない場合がどういう場合なのかということについては、正直よくわからない。

続いて、下のforeach()では、前回作成したroutesプロパティ(連想配列)のキーが、引数として受けた「/status/post」の中に含まれているかを確認している。

参考に前回仕様した画像を貼りつける。

この中に「/status/post」というキーはあるだろうか??上から2つ目にそれはある!!

では、話を戻すがもし引数が「/status/post」ではなく、「/user/takamori」の場合はどのような挙動をするのだろうか。

上の画像の中に「/user/takamori」というキーはもちろんない。

しかしこの中にいかにも怪しい「/user/(?[^/]+)」というキーがある。前回ブログを見てくれた人には説明したが、これはphpの都合上このように表示されているだけであって、実際の中身は「/user/(?<user_name>[^/]+)」だ。

そして、(?<user_name>[^/]+)これの意味についてはスラッシュ以外の文字列があったとき、連想配列のキー「user_name」にそのスラッシュ以外の文字列をキーの値とするという説明も合わせて前回行った。

引数が「/status/post」のときには、なかったのだが、(?<user_name>[^/]+)の両端にある()にも実は意味がある。この()はサブパターンというもので、この()内に一致した文字列は、preg_match()関数の第3引数である$matchesに配列として格納されるのだ。

この配列は基本的には添字配列なのだが、?<user_name>のようにすることで、値にキーをつけ、連想配列とすることができる。

その後、もともとあった各、[contoroller] => status   [action] => post の配列に今マッチした配列をarray_marge()関数で合体させてやるのだ。

これは正直口で説明してもわからないと思うので、実際このメソッドでできた結果を目で確認してみたいと思う。

$aは前回と全く同じルーティング定義配列だ。

更に今回は$b~$gとして、指定されるであろうと考えられるパスインフォをそれぞれ代入してみた。

また、ルーティング定義配列上、コロンのついている箇所については、適当なurlを指定している。

これを出力したものが次の画像だ。

どうだろうか、添字の配列は無視してほしいのだが、コロンのついている動的なurlがあった箇所については、[controller]・[action]の他に[user_name]や[id]などの連想配列のキーが新たに追加されていることがわかる。

これをルーティングパラメーターというらしい。

このルーティングパラメーターを使用して、ユーザーからurlにアクセスがあったとき、[controller]や[action]の他、動的パラメーターなどをもって各対応するのであろう。

ということで、今回はここまでだ。以上2回に渡ってルーティングの説明をしてみたが、俺もまだまだわからないことだらけだ。

もし間違っていることや、関連する知識などがあったらコメントなどで教えてくれ!

ではまた次回もよろしくオナシャス!