webページよりコントローラまでの流れ
phpフレームワーク各種、並びにwordpressなどのcmsツールなどはweb公開領域にあるphpファイルを処理の基点にしています。
単純にそのファイルにつらつらと処理を連ねて出力処理につなげるという方法も考えられますが、複雑な処理を施す場合などはその処理を小分けにし、公開領域に露出させないファイルに振り分けるようにすることが一般的になっております。
その際のスタートになるのが今回の流れとなります。フレームワークそれぞれ、振り分ける方法はいろいろあるようですが、基本的には、以下のような流れになっていると認識しております。
以下http://localhost/news2/でアクセスした場合にそのアドレスから必要とされる処理を振り分けるまでの流れを説明していきます。
決まりごと
webページ指定の決まりごとについてここでは以下のように決めました。
- DOC_ROOT/APP_NAME/##/%%/?param=value&…..というように呼び出します。
- ##はコントローラ名であり、##Controller.phpの##Controllerクラス、##Request.phpの##Requestクラスの呼び出しにつながります。
- %%は##Controllerクラスの%%Action()につながります。
- ##,%%は半角英字で定義します。
- ##,%%省略の場合はindexとして定義されます。
- 定義されるphpファイル名、クラス名の最初の一文字は大文字表記となります。
処理の基点index.php
/SYSROOT/htdocs/APPNAME/index.php
処理の基点index.php
オートロードや例外処理に係わるコードは別として考える(次項で説明いたします)と、Dispatchクラスのdispatcherを呼び出しているだけです。
ポイントはdispatcherメソッドの引数である$_SERVER[‘REQUEST_URI’]というサーバ変数です。これはローカル環境では以下のように取得されます。
振り分けに必要なのはcontrollerとactionの部分だけですが?以降のところをparam/valueあるいはanyone/anyoneというように指定して振り分けの項目を増やすことも可能です。
またpath_infoというサーバ変数でも取り出せるようですが、rewriteとの併用では単純に振り分け処理に使えない場合もあるようなので、request_urlを採用することにしました。
リライトによるwebサーバの設定.htaccess
/SYSROOT/htdocs/APPNAME/.htaccess
phpinfo()
を使ってphp設定を確認します。
LoadModuleでmod_rewrite.soが有効になっていればokです。
記述する項目
- Options +FollowSymLinks
- オプションでシンボリックリンクを有効にする。ということらしい。rewrite処理の中でこの機能が使えないとリライト処理が出来ない場合があるとのことであるが、詳細はわからず。
- RewriteEngine On
- 文字通り、リライト機能を走らせる
- RewriteBase /news2
- リライト対象ファイルのベースとなるディレクトリの指定、このディレクトリ以下がリライト対象になる。尚、.htaccessファイルが置かれているディレクトリであれば省略できる
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCondはリライト対象のファイルの条件設定に使われる。%()の(matchfilename)は後方参照と呼ばれるものでmatchfilenameを以降%1という変数に置き換えて利用することが出来ます。複数あれば左から%2,%3…というように利用できます。尚後述するRewriteRuleでは%ではなく$として置き換えて同じように表現することが出来ます。REQUEST_FILENAME は、リクエストされたurlにサーバパス情報を含めたものを示します。!は否定、dはディレクトリであるということなので、リクエストされたものがディレクトリとして存在しないものということになる。
- RewriteCond %{REQUEST_FILENAME} !-f
- ディレクトリの場合と同じような解釈であり、リクエストされたものがファイルとして存在しないということになる。
- RewriteRule ^(.*)$ /news2/ [QSA,L]
- RewriteRule 条件 置換文字列 [フラグ]となります。ここではホスト以下、/APPNAME/index.phpにアクセスをまとめたいのですべてのファイルアクセスを/news2/index.php(省略可能)
に変えるということです。その後ろのQSAは書き換え前のクエリー文字列(?より後ろの文字列)を書き換え後でも引き継ぐということです。Lはlastということで、書き換え処理はここで終了するということを意味します。
もし.htaccess設置フォルダーに他の拡張子を持ったファイルは適応除外したいのならば以下のような書き方になります。
RewriteRule !\.(pdf|ico|gif|jpg|png|css|html|xml)$ /news2/ [QSA,L]
url指定による処理の振り分けDispacher.php
/SYSROOT/framework2/mvc/Dispatcher.php
プログラムの大まかな流れは以下のようになっております。
- url文字列からcontroller名を取り出す。
- controller名からcontroller名としてクラスのインスタンスを生成する。getControllerInstance($controller)
- url文字列からaction名を取り出し、actionメソッド名を生成し存在確認をする。
- controller名からrequest名としてクラスのインスタンスを生成する。getRequestInstance($controller)
- コントローラの初期設定をし処理をコントローラに移す。setController($controllerInstance, $action, $requestInstance)
- コントローラでの処理を動かす。controllerRun($controllerInstance)
例外処理に引っかからなければ処理の流れはアプリケーションのメイン処理となるcontrollerに移されることになります。戻り値の$retはテストにつかわれるものである、実際の動作には直接関係しないです。