- 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!!
ではでは。
- Newer: Ktai Library勉強会に行った
- Older: フレームワークを作る ルーティング処理 調査編 その2
Comments:0
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(コピペプログラマから書けるプログラマへ)