LoginSignup
1
1

More than 5 years have passed since last update.

HerokuとかPaaS上のEthnaのURLを、パラメータ使ってもイイ感じにする

Last updated at Posted at 2012-12-21

この記事はEthna超超超初心者向けの内容です。

どうも、M_Ishikawaです。Advent Calendar 2回目の投稿です!

1回目の投稿 HerokuとかPaaS上のEthnaのURLをイイ感じにする をやったあと、またまた問題に直面してしまいました。。

それは、URLパラメータを渡す時です。

その前に前回のおさらいをすると、、、

EthnaデフォルトのアクセスURLはアクション名を「page」とした場合

http://xx.xx.xx/?action_page=true

のようなイケてない感じになるのを、

app/Appid_Controller.php
<?php
//…

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['REQUEST_URI']))
    {
        $redirect_url = $_SERVER['REQUEST_URI'];
        $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'];
    }
}

を追記することでイイ感じのURL

http://xx.xx.xx/page

へのアクセスでページが表示されるようになります。
ここまでが前回の内容。

が、しかし…

これだとURLパラメータを渡すことができませんでした。そ、そんなあ(´Д`)

http://xx.xx.xx/page?type=3
  • Appid[24533](ERR): Ethna_Controller._trigger_WWW(class/Ethna_Controller.php:875): undefined action [pagetype] [ERROR CODE(32)]

アクション名が[pagetype]???あきらかにおかしい。

再度いくつかの環境変数にvar_dumpを仕込んでアクセスしてみます。

app/Appid_Controller.php
<?php
//…

var_dump($_SERVER['REDIRECT_QUERY_STRING']);
var_dump($_SERVER['QUERY_STRING']);

var_dump($_SERVER['REDIRECT_URL']);
var_dump($_SERVER['REQUEST_URI']);

すると

出力
string 'a=0&b' (length=5)
string 'a=0&b' (length=5)

string '/index.php' (length=10)
string '/page?a=0&b' (length=11)

なるほどー、元の記事でREDIRECT_URLを使っていたのはパラメータがくっつかないからなのね。
しかしこのHeroku PaaS環境でRewriteを二重で行なっている我が環境では、やはりREQUEST_URIを使ってパラメータ部を分離するしかないようだ。

で、書き換えた。

app/Appid_Controller.php
<?php
//…

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?a=0&b#c でもイケる方式
    if (!empty($_SERVER['REQUEST_URI']))
    {
        $redirect_url = preg_replace('/\?(.*)$/', '', $_SERVER['REQUEST_URI']);
        $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'];
    }
}

よしと、これでバッチリ!

enjoy! Ethna on heroku!!

![M_Ishikawa](http://api.osae.me/retwipi/M_Ishikawa) [@M_Ishikawa](http://twitter.com/M_Ishikawa)
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1