少々長いです。
まず、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 件のコメント:
コメントを投稿