少々長いです。
まず、setSystemRoot()はindex.phpで使用していました。
このシステムのルートディレクトリをセットするメソッドです。
dispatch()は受け取ったリクエストのルートより後を、
スラッシュ区切りでコントローラやアクション(コントローラ内のメソッド)に振り分けるのが
主な仕事です。
余分なところを取り除いた後で、スラッシュ区切りで配列に収納します。
具体的には、
http://****/saso1_0/
を取り除きます。
その後のリクエスト、例えば、
item/addItem/
であれば、まずitemの頭文字を大文字にして、"Controller"をくっつけてクラスを呼び出します。
そして、addItemは"Action"をくっつけてそのコントローラのメソッドを使います。
デフォルトは双方とも"start"としています。
つまり、item/だけであれば、ItemControllerクラスのstartAction()が呼ばれます。
さて、二つのパラメータの後にもスラッシュでリクエストが続いていたら、
以降はスーパーグローバル変数の$_GETに代入します。
スーパーグローバル変数には代入できないのかと思いましたが、$_GETには代入できるようです。
スラッシュで区切りながら、収納していきます。
<?php namespace saso\classes\base; class Dispatcher{ private $_sysRoot; public function setSystemRoot($path){ $this->_sysRoot = rtrim($path, '/'); } public function dispatch(){ $param = ereg_replace('/?$', '', $_SERVER['REQUEST_URI']); $param = ereg_replace(PROGRAM_DIR, '', $param); $param = ereg_replace('^/*', '', $param); $params = array(); if('' != $param){ $params = explode('/', $param); } //_GET(UrlParameter用) $_GET[0] = ''; if(2 < count($params)){ for($i = 0; $i < count($params) - 2; $i++){ $_GET[$i] = $params[$i+2]; } } //controller if(isset($params[0]) && 'start' == $params[0] && 'start' == $params[1]){ header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/',TRUE,'301'); } $controller = 'start'; if(0 < count($params)){ $controller = $params[0]; } $className = ucfirst(strtolower($controller)) . 'Controller'; $className = '\\saso\\classes\\controllers\\' . $className; try{ $controllerInstance = new $className(); }catch(\Exception $e){ $ctrlbase = new \saso\classes\controllers\ControllerBase(); $ctrlbase->error($e->getMessage()); die(); } //action if(isset($params[0]) && !isset($params[1])){ header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $controller . '/start/',TRUE,'301'); } $action = 'start'; if(1 < count($params)){ $action = $params[1]; } $actionMethod = $action . 'Action'; try{ if(!method_exists($controllerInstance, $actionMethod)){ throw new \Exception('notFound'); } $controllerInstance->$actionMethod(); }catch(\Exception $e){ $ctrlbase = new \saso\classes\controllers\ControllerBase(); $ctrlbase->error($e->getMessage()); die(); } } }
以下のサイトを大いに参考にしました。PHPのオブジェクト指向、MVCアーキテクチャーについてわかりやすく説明しています。
http://www.objective-php.net/
0 件のコメント:
コメントを投稿