アプリケーションを作る
前処理を考える:フックによるURI情報の加工
前頁:ルーティング、コントローラー、モデルの続き。URLと実際のファイルの対応関係がズレてしまう場合の例外処理について。
table of contents
URL要求とローカルパスが一致しない3つの場合
(1)/(スラッシュ)で終わるURLへの要求。実はインデックスファイルパス。
(2)ホームページへの要求。
(3)/(スラッシュ)で終わっていないのに、ファイル拡張子が書かれていない要求。
(1)(2)の場合は、index.htmlを加えたパス処理が必要。(3)の場合、拡張子なしのファイルを扱う予定がないので、これはすべてディレクトリとみなし、ディレクトリパスにスラッシュを付け直す処理が必要。
上の処理は、イベントとフックを理解するでメモしたKohanaのフック機能を利用して、ルーティング処理イベントの前後をいじっておくのが楽そうである。
また、ついでにファイル拡張子に対応するmimeタイプ判定も、この時点でやっておきたい。
ということで、以下、処理覚え。
フックで対応
/hooks/bsn.php:拡張子がないものは必ずディレクトリとみなすように、強制的に/を付けてリダイレクトをかける。またホームページ情報の取得。
class bsn {
static $rul;
public function url()
{
self::$url['extension'] = '';
self::$url['mime'] = '';
if (array_key_exists('PATH_INFO',$_SERVER)) {
$path = $_SERVER['PATH_INFO'];
$extension = strtolower(substr(strrchr($path, '.'), 1));
if (ereg('\/',$extension)) {
die('"'.$extension.'" extension is invalid');
}
if ($path != '/index.html') {
self::$url['homepage'] = FALSE;
}else{
self::$url['homepage'] = TRUE;
}
if ($extension) {
self::$url['extension'] = $extension;
if ($mime = Kohana::config('mimes.'.$extension)) {
self::$url['mime'] = $mime;
}
}
} else {
$path = '';
self::$url['homepage'] = TRUE;
}
この間に、$url['scheme']を得るための処理が入っているが略。
self::$url['path'] = $path;
self::$url['component'] = $_SERVER['SERVER_NAME'];
self::$url['base_url'] = self::$url['scheme'].'://'
.self::$url['component'];
}
public function redirection()
{
$path = self::$url['path'];
if (!$path) {
return;
}
if (self::$url['extension']) { //must be file not dir
if(!self::$url['mime']) {
die("file extension is '".
self::$url['extension']
."'[this file's mime ....invalid]");
}
} else {
preg_match("#/.*/$#",$path,$p);
if (!$p) {
url::redirect(self::$url['base_url'].$path.'/');
}
}
}
}
Event::add('system.ready',array('bsn','url'));
Event::add('system.post_routing',array('bsn','redirection'));
上に書いた(3)の場合=拡張子がついていないパスで末尾にスラッシュが無いものをディレクトリと見なす、という処理については、内部の変数を弄るよりは、強制的にスラッシュを付いたパスにリダイレクトしてしまうのが楽。そうすれば、上に書いた(1)の場合のルーチンが動いてくれるから。
上のコードは、controllerイベント前に蠢いているので、controllerが呼び出された時には
- bsn::$url['mime']が空の時は、実は/で終わるURLが要求されており、インデックスファイル(index.html)が呼び出される必要ある。
- bsn::$url['homepage']が真の時は、インデックスファイルを指定されていないホームページへのアクセスを示しており、インデックスファイルが呼び出される必要がある。
という二条件だけを頭にいれて、モデルを作成すればよい。