2008年05月31日

CodeIgniter その5

GET リクエストも使いたいが、enable_query_strings はOFFのままにしたい、という状況は比較的多いと思う。
CodeIgniter では GET リクエストを処理するための構造は備わっているものの、enable_query_strings の設定に応じて勝手に無効化されてしまうため非常に使い勝手が悪い。

この場合もっとも手っ取り早い解決策は入力クラスのコンストラクタをオーバーライドすること。

use_xss_clean = ($CFG->item('global_xss_filtering') === TRUE) ? TRUE : FALSE;
$this->allow_get_array = TRUE; //($CFG->item('enable_query_strings') === TRUE) ? TRUE : FALSE;
$this->_sanitize_globals();
}

};

?>

enable_query_strings を無視するようにしただけの単純なもの。これで $this->input->get('foo') などで GET リクエストの内容が取得できる。
ただし注意しなければいけないのは、常に GET を有効な状態に変更することで uri_protocol が AUTO に設定されている場合に上手くセグメントが見つけられなくなり、正しくコントローラを見つけ出せなくなること。
主な解決策としては uri_protocol を AUTO 以外に設定するか、あるいは URI クラスの _fetch_uri_string() をオーバーライドして $_GET は無視するようにしてしまうこと。
後者の方が適切な設定を見つけやすいとは思うが、最初から最適な処理を選ぶようにしてしまえば無駄な負荷は減るため、前者の手段の方が総合的に見てメリットがあると思う。

なお GET リクエストに対して応答する場合はバリデーションクラスを使うことが出来ないので、バリデーションクラスの run() メソッドを $_GET に対して行うようにした run_get() のようなメソッドを追加するなどして、厳しく入力チェック出来る環境を整えた方がよさそう。

ちなみにページネーションクラスを使用する場合に引数を与えるために、GET リクエストを使う方法は悪いとは思わないけども良くもないと思う。
そうするぐらいなら、http://somedomain.com/search/index/3/Keyword/ などとして、ページ数の後ろにURLエンコードしたキーワードを付けるようにしたりした方が構造的に無理なく作れると思う(urlencode() ではなく rawurlencode())。


posted by oov at 07:45| Comment(0) | TrackBack(1) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント

この記事へのトラックバック

CodeIgniterによるQUERY_STRINGの扱いの問題
Excerpt: QUERY_STRINGの扱いの問題 CodeIgniter(以下CI)では、標準では、QUERY_STRINGは全て無効化されてしまう(与えても消去される)という豪快な仕様になっている。 一応以下の..
Weblog: Ryuzee.com
Tracked: 2008-08-10 15:15
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。