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())。