CodeIgniter 預設依 URI 第二段決定呼叫 Controller 方法:example.com/index.php/blog/comments/ → Blog::comments()。
若 Controller 定義 _remap(),所有 URI 規則失效,統一導向 _remap(),開發者自行決定呼叫哪個方法,實現「方法級路由重寫」。
public function _remap() {
// 所有請求進入此處
}
原 URL:/blog/display_successful_message
目標 URL:/blog/successful
public function _remap($method) {
if ($method === 'successful') {
$this->display_successful_message();
} else {
$this->$method(); // 其他方法正常呼叫
}
}
public function _remap($method, $params = []) {
$user_type = $_SESSION['user_type'] ?? 'guest';
$access_control = $this->validate_access($user_type, $method);
if ($access_control) {
// 使用 call_user_func_array 支援參數傳遞
call_user_func_array([$this, $method], $params);
} else {
$this->show_message('權限不足', 'error');
}
}
private function validate_access($user_type, $method) {
$rules = [
'admin' => ['*'],
'editor' => ['create', 'edit', 'view'],
'guest' => ['view'],
];
$allowed = $rules[$user_type] ?? [];
return in_array('*', $allowed) || in_array($method, $allowed);
}
public function _remap($method, $params = []) {
// 預設動作
if (empty($method)) {
$method = 'index';
}
// 方法存在性檢查
if (!method_exists($this, $method)) {
show_404();
return;
}
// 前置攔截:日誌、CSRF、速率限制等
$this->before_action($method);
// 呼叫目標方法
call_user_func_array([$this, $method], $params);
// 後置處理
$this->after_action($method);
}
_remap() 接收兩個參數:$method (URI 第二段)、$params (剩餘段落陣列)_remap() 內手動派發_output() 可進一步統一輸出格式 (JSON/XML/HTML)摘自 jackyrong