Net_URL_MapperをつかったUrlhandlerプラグイン

書いた人いちい2007-07-23初版

まだ書いてる途中です。パッケージ近日公開予定

Ethna_Plugin_Urlhandler_NetURLMapper プラグインは、 PEAR パッケージの 1 つである Net_URL_Mapper を使って、もともとの Ethna_UrlHanlder よりも簡単にアプリケーションの URL を扱うことができます。

概要

Ethna_UrlHandler は、たとえば http://example.jp/index.php/echo/hoge という URL から echo アクションに msg="hoge" をパラメタとして実行するといった機能を提供します。とても複雑なルールが記述できる一方で、簡単なルールでも複雑となってしまい、ちょっと使いづらい場面もありました。

Net_URL_Mapper は、フレームワークとは独立した単体のライブラリとして、より簡単な記述で同様な機能を実現することができます。

Net_URL_Mapper パッケージの description からの引用:

The URL syntax is similar to what can be found in Ruby on Rails or Python Routes module and as such, this package can be compared to what they call a router. Still, Net_URL_Mapper does not perform the dispatching like these frameworks and therefore can be used with your own router.

Urlhandler_NetURLMapper プラグインは、 Net_URL_Mapper オブジェクトに Ethna のコントローラやアクションフォームから直接呼び出される UrlHandler のインタフェースを提供します。

インストール

Net_URL_Mapper は php5 以降が必要です。

↓以下はまだできません

% ethna install-plugin --alldeps urlhandler neturlmaper

利用例

アプリケーションの UrlHandler クラス (App_UrlHandler) の getInstance() をオーバーライドして Urlhandler_NetURLMapper プラグインのインスタンスを返すようにします。

 function &getInstance($class_name = null)
 {
     $instance = parent::getInstance('NetURLMapper');
     if ($instance->getMapper() === null) {
         $mapper = Net_URL_Mapper::getInstance();
         $mapper->connect(
             '/echo/*msg',
             array('action_echo_msg' => true)
         );
         $mapper->connect(
             '/printf/:format/*param',
             array('action_printf' => true)
         );
         $instance->setMapper($mapper);
         $instance->setPathPrefix('index.php');
     }
     return $instance;
 }

Net_URL_Mapper の設定は、プラグインに setMapper() でインスタンスを渡す前にする必要があります。*1

  • $mapper->connect()
    • Net_URL_Mapper のメソッドで、 URL のマッピングの設定を記述します。
  • $instance->setMapper()
    • Urlhandler_NetURLMapper プラグインに Net_URL_Mapper のインスタンスを渡します。
  • $instance->setPathPrefix()
    • Net_URL_Mapper 自身も PATH_INFO の prefix 部分を扱う仕組み (/ja, /en など) がありますが、 Ethna では Smarty の {url} プラグインなどの都合で UrlHandler 自体がそれを知っている必要があるため、このような指定方法になってます。

TODO

  • B.C. わすれてきれいにしたいです。
  • Net_URL_Mapper のインタフェースなのか、 Net_URL_Mapper 自体を取り込んだ感じの「設定が簡単にできます」的なプラグインなのか、ちょっと悩みどころ*2

*1 なんとか綺麗にしたいです
*2 どっちでもできるのが一番ですよね