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) */ }
しかしこの方法だと「ページを移動しています」みたいな画面を出せないのでいまいちかも。むーん。