読者です 読者をやめる 読者になる 読者になる

Ethnaでリダイレクトの件はどうなった?

Ethna

Ethnaでリダイレクト(ロケーション)させるのっていまのところまだ決定版てでてないんでしょうか。

探したところ下のところが見つかったので、参考にさせていただきつつ僕も考えてみました。

Appid_ActionClass.php:

<?php

function redirect($place, $params = array())
{
    // 遷移場所を決定
    if (preg_match('/^https?:\/\//', $place)) {
        // URL
        $url = $place;
    } else {
        $url = $this->config->get('url');

        if (preg_match('/^\//', $place)) {
            // 絶対パス
            $url .= $place;
        } elseif (preg_match('/\//', $place)) {
            // 相対パス
            $url .= dirname($_SERVER['SCRIPT_NAME']).'/'.$place;
        } else {
            // アクション名
            $url .= $_SERVER['SCRIPT_NAME'].'?'.$this->backend->controller->getActionRequest($place, 'url');
        }
    }

    // リクエストパラメータを連結
    if (count($params) > 0) {
        if (strpos($url, '?') === false) {
            $url .= '?';
        } else {
            $url .= '&';
        }
        $url .= http_build_query($params);
    }

    return 'Location: '.$url;
}

Appid_Controller.php:

<?php

function _sortForward($action_name, $retval)
{
    $forward_name = $retval;
    if (preg_match('/^Location: (.*)$/i', $forward_name)) {
        $this->logger->log(LOG_INFO, 'forward_location[%s]', $forward_name);
        header($forward_name);
        return null;
    }

    $forward_path = $this->_getForwardPath($forward_name);
    $this->logger->log(LOG_INFO, 'forward_name[%s]', $forward_name);
    return $forward_name;
}

アクションにredirect()を追加し、コントローラで_sortForward()をオーバーライドしました。
使い方はこんな感じ。

<?php

    function perform()
    {
        // hogeアクションにリダイレクト
        return $this->redirect('hoge');

        /*
        - $this->config->get('url') が http://www.example.com/aaa
        - エントリポイントがindex.php
        の場合

        // アクション名
        return $this->redirect('hoge');
        // (Location: http://www.example.com/aaa/index.php?action_hoge=true)

        // URL
        return $this->redirect('http://www.google.co.jp/');
        // (Location: http://www.google.co.jp/)

        // 相対パス
        return $this->redirect('hoge/fuga');
        // (Location: http://www.example.com/aaa/hoge/fuga)

        // 絶対パス
        return $this->redirect('/hoge/fuga');
        // (Location: http://www.example.com/hoge/fuga)
        */
    }

しかしこの方法だと「ページを移動しています」みたいな画面を出せないのでいまいちかも。むーん。