CHIBATCH.JP

CakePHPとかZend Frameworkとか、最近のフレームワークには標準で付いてくるURLのルーティング機能を自作のフレームワークに実装したい。

探してみるとPEARのNet_URL_Mapperというとても便利なライブラリがありました。PHP5でしか使えないみたいです。

2年前のバージョン0.9.0が最新という点が少し気になりましたが、あまり問題なさそうです
基本的な使い方は、PEAR::Net_URL_MapperでURLルーティングを制御するURLルーティングを作る - part one : PEAR::Net_URL_Mapperに書かれています。

ダウンロード

まずはPEAR - PHP Extension and Application RepositoryNet_URL_Mapperからダウンロードして、適当なフォルダに解凍。
コマンド叩いてインストールとか出来ればとても楽ですが、わからない時は直接ファイルをダウンロードして、解凍しても使えます。(ダウンロードできるファイルはtgzなので、tgzを解凍できるソフトは別途必要になります)

基本的な使い方

$router = Net_URL_Mapper::getInstance();
$router->connect('/:controller/:action');
var_dump($router->match($path));

$pathには$_SERVER['REQUEST_URI']などから作ったパスの情報が入ります。
例えばこの記事で言ったらphp/pear-net-url-mapperになりますでしょうか。

実行結果はこんな。

array(2) {
  ["controller"]=>
  string(3) "php"
  ["action"]=>
  string(19) "per-net-url-mapper"
}

これを元にコントローラとアクションを指定してやれば、Zendっぽいルーティングとかも簡単にできちゃいます。
より詳細な使い方は、PEAR::Net_URL_MapperでURLルーティングを制御するURLルーティングを作る - part one : PEAR::Net_URL_Mapperにてわかりやすく説明されているので、そちらを参照ください。

Zend Frameworkっぽいルーティング

ただ、これだけだと個人的に面白くないので、ZendっぽいルーティングをNet_URL_Mapperを使って実装してみようと思います。
じゃーZend使えばと言われてしまうと、おっしゃる通りですとなってしまうので、それは言わないでおいてください。

Zendっぽいルーティングっていうのは、Zend Framework: Documentに書かれいている「デフォルトのルート」ってやつです。
いろいろ面倒なので、今回の例ではモジュールはなしで。

$router = Net_URL_Mapper::getInstance();
$default = array(
  "controller" => "index",
  "action"   => "index",
  "params"   => ""
);
$router->connect(':controller',$defualt);

$router->connect(':controller/:action',$defualt);
$router->connect(':controller/:action/*params',$defualt);

$match = $router->match($path);
$className  = $match['controller'] . 'Controller';
$actionName = $match['action'] . 'Action';

$controller = new $className();
$controller->$actionName($match['params']);

connectメソッドは複数定義できるので、複数定義してしまいます。
ルーティングを複数定義した場合は上から順番にマッチしているかどうか確認されるみたいです。

これをこのブログにあてはめてみようと思います。

http://blog.chibatch.jp/の場合

//$parh = "";
var_dump($router->match($path));
array(3) {
  ["controller"]=>
  string(5) "index"
  ["action"]=>
  string(5) "index"
  ["params"]=>
  string(0) ""
}

こういう結果になるので、indexControllerのindexActionメソッドが実行されます。

http://blog.chibatch.jp/phpの場合

// $path = "php";
var_dump($router->match($path));
array(3) {
  ["controller"]=>
  string(3) "php"
  ["action"]=>
  string(5) "index"
  ["params"]=>
  string(0) ""

phpControllerのindexActionが実行される。

http://blog.chibatch.jp/php/pear-net-url-mapperの場合

// $path = "php/pear-net-url-mapper

var_dump($router->match($path));
array(3) {
  ["controller"]=>
  strng(3) "php"
  ["action"]=>
  string(19) "pear-net-url-mapper"
  ["params"]=>
  string(0) ""
}

phpControllerのpear-net-url-mapperActionが実行されます。

http://blog.chibatch.jp/php/pear-net-url-mapper/commentの場合

// $path = "php/pear-net-url-mapper/comment";
var_dump($router->match($path));
array(3) {
  ["controller"]=>
  strng(3) "php"
  ["action"]=>
  string(19) "pear-net-url-mapper"
  ["params"]=>
  string(7) "comment"
}

phpControllerのpear-net-url-mapperActionに変数commentが渡される感じです。

ざっと書いてみました。(最後の例とか間違っているかも知れません)。
Net_URL_Mapperはとても便利に使えるライブラリです。

Zend FrameworkもPHP5でしか使えないし、もうPHP4とかいいじゃんと思うんですがまだ残っている以上仕方ないのでしょうか...。
やっぱりPHP4にも対応できるように作った方がよいのかな。みんなはどうしてるんでしょうか

TAG

COMMENTS

コメントはまだありません。ぜひあなたの一言を!

GIVE ME A COMMENT!