目次

PATH_INFOを使ったRequest-URIからのパラメータの取得

書いた人: いちい

概要

Request-URIからパラメータを取得したいときは、Ethna_UrlHandlerクラスを使うと便利です。

Ethna_UrlHandlerは次の2つの機能を持っています。

また、Ethna-2.3.2からEthna_UrlHandlerがプラグインを使っても利用できるようになりました。

Net_URL_Mapperを使ったUrlhandlerプラグイン

UrlHandlerとエントリポイント、mod_rewriteとの関係などについては、以下を参照してください。

URLHandlerの設定例

使用例

新規にプロジェクトを作ると、app/Appid_UrlHandler.phpファイルが作られ、アプリケーションのUrlHandlerクラスが用意されます。この中の$action_mapを設定することでUrlHandlerが利用できます。デフォルトではなにもしません。

以下では、 http://localhost/sample/index.php/echo/hello のアクセスで、エントリポイント index.php にパラメータ echo='hello' を指定するための例を説明します。

$action_map の設定

_getPath_Index() 関数の定義

アクションとパラメータからPATH_INFOを含むURLを生成するときに使われます。現在のところ、Ethna組込みのSmarty関数{url}を利用するときのみ必要な作業です。

上のエントリポイントで指定した 'index' に対応するものとして、 _getPath_Index() という関数名になります。

URL_HANDLER 変数の設定

$action_map の中で 'index' の設定を使うことを指示するために、エントリポイントで $_SERVER['URL_HANDLER'] の値を 'index' に設定します。

$_SERVER や SetEnv を経由するのは複雑なようですが、 $action_map のエントリが膨大になった場合に、リクエストのたびに膨大な量の照合が発生することを避ける意図があります。

$config['url'] の設定

さらに、アプリケーションの(ベースとなる)URLを設定します。これは、htmlの相対パス指定がPATH_INFOによって混乱するのを避けるためです。

echo_msg アクションを追加

これで http://localhost/sample/index.php/echo/hello にアクセスし、"message = hello" と表示されれば成功です。

細かい使いかた

PATH_INFOから複数のパラメータを取得する

例:

'printf_msg => array(
    'path' => 'printf,
    'path_regexp' => array(
        1 => '|^printf/([^/]*)$|',
        2 => '|^printf/([^/]*)/([^/]*)$|',
    ),
    'path_ext' => array(
        1 => array(
            'msg' => array(),
        ),
        2 => array(
            'format' => array(),
            'param' => array(),
        ),
    ),
),

1の正規表現にマッチしたときは'msg'にパラメータを、2にマッチしたときは'format'と'param'にパラメータを入れる、という使いかたができます。

path_extのパラメータ

'path_ext' => array('msg' => array()) の array() の中には、次のパラメータが指定できます。

なお、PATH_INFO生成はrawurlencode()を用いたエンコードを施します。フィルタなどの処理は上に書いた順に行われ、rawurlencode()はurl_prefix/suffixを付加する直前に実行されます。

PATH_INFOの正規化

'path_regexp' で指定した正規表現とマッチングされるPATH_INFOは、スラッシュ ('/') の重複と先頭、末尾のスラッシュを取り除いた状態に正規化されています。

getPath*() の返り値

先ほどの例では、 array('/index.php/', array()) という2つの要素を含む配列を返していました。この意味について説明します。(この内容はPATH_INFOを生成するときの話です。)