WEBアプリケーションフレームワーク(主にPHP)のルーティング処理について (never まとめ)
とくにまとめられてないメモ書きです。とくに主張とか結論はないです。(あ、Hello Worldベンチマーク?プギャーm9(^Д^) は言わずもがなです )
前提:主にPHPではURLとアクションのマッピングについて上から順に以下のような変遷をたどってると思います(そうじゃないって突っ込みはいっぱいあるでしょうが)
-
/foo/module.php?key=var
命名規則型
/controller/action/ => class Acontroller { function action(){ $parameter = func_get_args(); }}
宣言型
$router->add('/controller/action/{:param}', $actionName)
・命名規則型がやっかいな一例はこういう所です
<?php class PostController { function readAction($id) { if (!is_int($id)) throw new InvalidArgumentException("id shoud be integer"); } }
Ver1時代のベンチマークとの関わり
またルーティング処理は、フレームワークそのものと密接な関係でもあり、ベンチマーク処理の部分では Ver1世代から焦点でもありました。
- http://blog.astrumfutura.com/2010/02/php-framework-benchmarks-entertaining-but-ultimately-useless/
- https://github.com/padraic/framework-benchs/blob/master/zend-1.10-optimised/public/index.php#L21-L74
(※ デフォルトのZF1では、addRouteはindex.php書かないということです)
ZFでの変遷
ルーティング処理についての、ZFの変遷やPros/Consについては、Ben Scholzenのスライドが詳しいです。
- http://www.dasprids.de/blog/2012/10/23/slides-for-my-zf2-router-presentation
- http://stuff.dasprids.de/slides/zendcon2012/introducing-the-new-zend-framework-2-router/presentation.html#28
マイクロフレームワーク
マイクロフレームワーク/ミニマムフレームワークは色々でましたが *1 特にBulletはネストされるルーティングとなっており面白い構造だとおもいます。
Fast!Fast!Fast!
ルーティングだけを処理機能としてみた場合、拡張モジュールで書かれたから早いぜっていう主張もあったりしますが、 nikicに突っ込まれてたりもします。
認証・認可
ルーティングが終わったらレスポンスを返せるという訳ではありません。認証と認可がかかわります。 認証だけならログインチェック後 /user/loginにリダイレクトすればいいだけかもしれません。 ですが認可となると、どのリソースにアクセスできるかも判定が必要です。
- http://www.slideshare.net/noopable/zendacl-in-servicelayer
- http://b.hatena.ne.jp/entry/tech.voyagegroup.com/archives/7644534.html
ここでkazuhookuさんが突っ込まれてるアクセス権はModelレイヤで処理するのが王道では?に同意します。
私の関心ごとの一つは「ログインはされてるけど、リソース全てにアクセス権がなかったユーザがリクエストを送ったときは?」 などのケースです。(私が言ってるリソースというのは、たとえば風俗サイトで有料オプションAユーザがバストサイズを知れる。有料オプションDユーザが顔写真を見れる。とかを想定しています)
その他
PHP以外も踏まえてWEBアプリルーティングに着目しての考察記事・論争っていうのをさがそうとしましたが、上手く見つけられませんでした。
他にもヴァリデーションにてfalse時にフォワード・リダイレクトはみたいな関心事項もあると思います。その点、こういうアプローチもあるのではという記事も書きましたがツッコミはいただいておりません。
....え、何?RESTについては?
関係のあるかもしれないツイート
@Hiraku Silex の場合はオブジェクトの生成コストの問題だと思います。ルーティング定義するたびに Route オブジェクト生成するみたいな感じだったので。そこさえなんとかすれば、探索効率自体は悪くても十分な速度は出せるとの https://t.co/k1LcRgIWZt
— Yuya Takeyama (@yuya_takeyama) July 5, 2014