2013年10月23日水曜日

在庫管理システム『SASO1.0』リクエスト振り分けクラス

今回は在庫管理システムのリクエスト自動振り分けクラスDispatcherです。
少々長いです。

まず、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 件のコメント:

コメントを投稿