Home > PHP > フレームワークを作る ルーティング処理 調査編 その3

フレームワークを作る ルーティング処理 調査編 その3

  • 2010-03-16 (火) 16:30
  • PHP

Url Routing with PHPを紹介してきました。このシリーズはラストみたいです。ルーティング処理だけでなく、MVCフレームワークのCを重点的にした単純なフレームワークを作成したところで完了みたいですね。元ネタはこちらです。
最後にデモとサンプルソースのダウンロードがありますが、URLからコントローラーとアクションの指定まで考慮している作りみたいです。

このシリーズを読んでき来た人たちへ。今までのコードに多少修正を加えました。多少ディレクトリ構成とAxial_URLInterpreterとAxial_Command objectを、多くはAxial_CommandDispatchクラスです。今回新たにAxial_Controllerというクラスを作成していきます。

フロントコントローラからコントローラーへアクセスするようにしましょう。方法として、名前のつけ方とディレクトリ構成のルールを決めて、各コマンド(アクション)を実行させるようにしましょう。コマンドが実行されるとき、該当のコントローラーが読み込まれ、executeメソッドが読まれるようにします。

<?php
/**
  * コントローラー実行クラス
  */
class Axial_CommandDispatcher
{
    var $Command;

    //  コンストラクタ 実行するコマンド(コントローラー)の格納
    function Axial_CommandDispatcher(&$command)
    {
        $this->Command = $command;
    }

    // 指定したコントローラーが存在するか
    function isController($controllerName)
    {
        if(file_exists('axial/controllers/'.$controllerName.'/controller.'.$controllerName.'.php'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // コントローラー実行
    function Dispatch()
    {
        $controllerName = $this->Command->getControllerName();

        //  指定したコントローラーが存在していなかったらエラーコントローラークラスを指定
        if($this->isController($controllerName) == false)
        {
            $controllerName = 'error';
        }

        // 指定したコントローラーを読み込む
        include('axial/controllers/'.$controllerName.'/controller.'.$controllerName.'.php');

        // インスタンス生成・実行
        $controllerClass = $controllerName."Controller";
        $controller = new $controllerClass($this->Command);
        $controller->execute();
    }
}
?>

include(’axial/controllers/’.$controllerName.’/controller.’.$controllerName.’.php’);の箇所を見て分かるように、コントローラー名に使用するディレクトリを作成し、実行するファイル名もcontrollerコントローラー名.phpのように名前付しなければならないような作りにしています。

自分でコントローラーを追加していく中で継承しなければいけないクラスがあります。Axial_Controllerです。Axial_Controllerでは、ディスパッチコントローラーから(Axial_CommandDispatcher)execute()が必ず呼ばれ、指定したアクションを実行する処理をします。指定したアクションがなかったら_error()関数を実行し、そもそも指定アクションがnullだったら_default()関数を実行します。指定アクションの命名規則は_を頭に付けるようにしています。

<?php
class Axial_Controller
{
    var $Command;

    // コンストラクタ
    function Axial_Controller(&$command)
    {
        $this->Command = $command;
    }

    // アクションの指定がなければ、この関数が呼ばれる
    function _default()
    {
    }

    // 指定したアクションがなければ、この関数が呼ばれる
    function _error()
    {
    }

    // ディスパッチャからこの関数が呼ばれる。アクションの振り分け。
    function execute()
    {
    	// アクション取得
        $functionToCall = $this->Command->getFunction();

        // アクションがnull
        if($this->Command->getFunction() == '')
        {
            $functionToCall = 'default';
        }

        //  指定したアクションがない
        if(!is_callable(array(&$this,'_'.$functionToCall)))
        {
            $functionToCall = 'error';
        }

        // 指定したアクションを実行
        call_user_func(array(&$this,'_'.$functionToCall));
    }
}
?>

あとアクションの指定ができるようになったことで、URLのパース処理も多少修正されているはずです。ちょっと見てみましょう。

<?php
class Axial_URLInterpreter
{

    var $Command;

    function Axial_URLInterpreter()
    {
        $requestURI = explode('/', $_SERVER['REQUEST_URI']);
        $scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
        $commandArray = array_diff_assoc($requestURI,$scriptName);
        $commandArray = array_values($commandArray);
        $controllerName = $commandArray[0];

        // ここが追加された箇所
        $controllerFunction = $commandArray[1];

        $parameters = array_slice($commandArray,2);

        // ルートで実行されているか
        // コントローラーの指定がなかったらrootコントローラーを指定
        // _defaultアクションが実行される
        if($controllerName == '')
        {
            $controllerName = 'root';
        }

        $this->Command = new Axial_Command($controllerName,$controllerFunction,$parameters);
    }

    function getCommand()
    {
        return $this->Command;
    }
}
?>

$controllerFunction = $commandArray[1];が追加されていますね。/でexploadされたものに0番目にコントローラー名、1番目にアクション名がくるだろうってだけですね。

他に特筆すべきことは、その2とその3のindex.phpを比べるとルーティング処理とコントローラーの呼び出し部分の処理は変わっていないのですが、HTMLの記述がなくなっています。各コントローラーのアクションで呼び出しされるようになっています。確かにMVCのCに重点的に実装したフレームワークになっているようです。

デモとサンプルコードがこちらに公開されています。

とりあえず、このチュートリアルは以上になります。

このチュートリアルを書いたDoug Hillさん。Thank you!!

ではでは。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.cypher-works.com/wp-trackback.php?p=1145
Listed below are links to weblogs that reference
フレームワークを作る ルーティング処理 調査編 その3 from CYPHER-WORKS(コピペプログラマから書けるプログラマへ)

Home > PHP > フレームワークを作る ルーティング処理 調査編 その3

Search
Feeds
Meta

Return to page top