ホーム > 日記 > Ethnaでアクション名はPATH_INFOから取得したい

Ethnaでアクション名はPATH_INFOから取得したい

Ethna×PHPは29日発売らしい。
錦糸町くまざわで聞いたら、「6月29日発売で当店では売り切れとなっております申し訳ございません」となぞなこと言われたのでAmazonさん。

Ethnaでアクション名の決定方法を変更するにはこちらを参考にします。
PATH_INFOでアクション名決定したい場合はこんな感じでControllerに追加。


    function _getActionName_Form()
    {
        return isset($_SERVER['PATH_INFO'])? str_replace('/', '_', trim($_SERVER['PATH_INFO'], '/')): null;
    } 

http://example.jp/index.php/test/ → Testアクション
http://example.jp/index.php/user/register → User_Registerアクション
これをやるとアクション名がPATH_INFO以外で取得できなくなるので、テンプレートでformタグを書くときに面倒です。
パラメータもPATH_INFOで取得したいと思ってもできませんので。
Ethna_UrlHandlerの使い方がちょっとわかりづらいのでEthnaでNet_URL_Mapperを使うをそのまま適用。


<?php
/**
 * @see http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/45
 */
require_once 'Net/URL/Mapper.php';

class {Appid}_UrlHandler extends Ethna_UrlHandler
{
    var $action_map = array(
        'global' => array(
            '/*action' => array(
                'action' => '',
            ),
        ),
    );

    function &getInstance($class_name = null)
    {
        $instance =& parent::getInstance(__CLASS__);
        return $instance;
    }

    function buildActionParameter($http_vars, $action)
    {
        if ($action == "") {
            return $http_vars;
        }
        $action = str_replace('/', '_', $action);
        $key = sprintf('action_%s', $action);
        $http_vars[$key] = 'true';
        return $http_vars;
    }

    function requestToAction($http_vars)
    {
        if (isset($http_vars['__url_handler__']) == false
            || isset($this->action_map[$http_vars['__url_handler__']]) == false) {
            return array();
        }
        $url_handler = $http_vars['__url_handler__'];
        $action_map = $this->action_map[$url_handler];
        // parameter fix
        $method = sprintf("_normalizeRequest_%s", ucfirst($url_handler));
        if (method_exists($this, $method)) {
            $http_vars = $this->$method($http_vars);
        }
        // normalize
        if (isset($http_vars['__url_info__'])) {
            $path = $http_vars['__url_info__'];
        } else {
            $path = ""; 
        }
        list($path, $is_slash) = $this->_normalizePath($path);
        $mapper = Net_URL_Mapper::getInstance($http_vars['__url_handler__']);
        foreach ($this->action_map[$http_vars['__url_handler__']] as $key => $value) {
            $mapper->connect($key, $value);
        }
        $result = $mapper->match($path);
        $http_vars = $this->buildActionParameter($http_vars, $result['action']);
        unset($result['action']);
        $http_vars = array_merge($http_vars, (array)$result);
        return $http_vars;
    }
} 

あとはindex.phpに以下をmain実行前に書く。


$_SERVER['URL_HANDLER'] = 'global'; 

UrlHandlerの使い方自体はPATH_INFOを使ったRequest-URIからのパラメータの取得を参照。
基本的にhttp://example.jp/index.php/action/name/でアクセスして、特殊なの作りたかったら、action_mapに追加する感じで。

カテゴリー: 日記 タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。