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に追加する感じで。
カテゴリー: 日記