Ethna で綺麗な URL (Ethna_UrlHandler を使わない方法)

はいどうもー。 Ethna ってデフォルトのままだと URL がイケてないですよね。Ethna_UrlHandler を使う方法もありますがアクション毎に mapping を書く必要があって若干面倒です。

というわけで Ethna で URL を綺麗にする簡単な方法をご紹介します。フォーム値がそのままなのでちょっとダサいですが、一度設定してしまえばアクション毎にマッピングを書く必要もないのでとても楽です。

  • 使用前: http://example.org/?action_hogehoge_fugafuga=true&id=10
  • 使用後: http://example.org/hogehoge/fugagufa/?id=10

1. 以下の .htaccess ファイルをエントリポイントと同じ場所に設置する

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /

	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule . /index.php [L]
</IfModule>

mod_rewrite を使ってリクエストをエントリポイントに集約します。ちなみにこれは WordPress が自動生成するものを拝借しました :-p

2. Appid_Controller クラスの _getActionName_Form メソッドを以下のような感じでオーバーライドする

function _getActionName_Form()
{
	if (isset($_SERVER['REQUEST_METHOD']) == false) {
		return null;
	}
		if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
		$http_vars =& $_POST;
	} else {
		$http_vars =& $_GET;
	}

	foreach ($http_vars as $name => $value)
	{
		if ($value == "" || strncmp($name, 'action_', 7) != 0) {
			continue;
		}
		// オリジナル方式 http://hostname/?action_action_name
		return parent::_getActionName_Form();
	}

	// かっこいい http://hostname/action/name/ 方式
	if (!empty($_SERVER['REDIRECT_URL']))
	{
		$redirect_url = $_SERVER['REDIRECT_URL'];
		$action_name = str_replace('/', '_', $redirect_url);
		return trim($action_name, '_');
	}

	// まあ悪くはない http://hostname/?action=action_name 方式
	if (array_key_exists('action', $http_vars))
	{
		return $http_vars['action'];
	}
}

デフォルトのアクション指定方法 (18 行目) を潰してしまうとフォームヘルパが動作しなくなるので要注意です。ひとまずこれだけで簡単に URL を綺麗にすることができます。

preload preload preload