CodeIgniter 3 默认将 URI 路径中控制器名和方法名之后的段自动作为参数传入方法,如 /user/profile/123/active 会调用 profile($id, $status) 并传入 '123' 和 'active';参数需在方法签名中显式声明(支持默认值),否则被忽略。

URI段参数怎么被控制器方法接收
CodeIgniter 3 默认把 URL 路径中除 index.php、控制器名、方法名之外的后续段,自动作为参数传给对应方法。比如访问 /index.php/user/profile/123/active,profile() 方法会收到两个参数:$id = '123' 和 $status = 'active'。
前提是控制器方法显式声明这些参数(支持默认值):
public function profile($id = null, $status = 'inactive')
{
echo "ID: " . $id . ", Status: " . $status;
}
- 不声明参数 → URI 段被忽略,
$this->uri->segment(3)才能手动取到 - 声明了但数量少于实际段数 → 多余段被丢弃(无警告)
- 声明了但数量多于实际段数 → 缺失位置用默认值填充,不会报错
路由规则里用 (:num) 或 (:any) 怎么映射参数
在 application/config/routes.php 中写 $route['user/(:num)'] = 'user/view/$1';,本质是让框架把匹配到的数字(如 123)替换到右边的 $1 位置,最终调用的是 User::view('123')。
关键点:
-
$1、$2对应正则捕获组顺序,不是 URI 段序号 -
(:num)只匹配纯数字,(:any)匹配非斜杠任意字符(含中文、下划线等) - 如果用了正则(如
'user/(\d+)/(\w+)'),必须用$1、$2显式引用,不能混用(:num)占位符 - 路由规则越靠前越优先,重复或宽泛规则(如
'user/(:any)')要放在具体规则(如'user/login')之后
重定向时怎么带参数过去
redirect() 函数本身不支持直接传参,比如 redirect('user/edit', $id) 是无效的。它只接受一个字符串路由名或路径。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
正确做法分两种:
- 拼接完整路径:
redirect('user/edit/' . $id)(确保$id已过滤,避免注入) - 用命名路由 +
route_to()(CI4):redirect()->to(route_to('user-edit', ['id' => $id])),前提是路由已定义为$routes->get('user/edit/(:num)', 'User::edit/$1')->setName('user-edit'); - CI3 中没有
route_to(),只能手拼或封装辅助函数
注意:拼接时别在 PHP 标签间留空格,否则生成 /edit/ %20123 这种带 %20 的坏 URL。
控制器构造函数能不能接收路由参数
不能。CI4 会报 Too many arguments to method;CI3 虽不报错但参数永远是 null 或未定义行为。
构造函数只该用于依赖注入(如 UserService、Request),运行时数据(ID、状态、搜索关键词)必须交给具体动作方法处理:
public function __construct()
{
// ✅ 正确:注入服务
$this->model = new UserModel();
}
public function view($id) // ✅ 参数在这里收
{
if (! is_numeric($id)) {
show_404();
}
$data['user'] = $this->model->find($id);
return view('user/view', $data);
}
这是最容易被绕晕的一点:URL 上看着是 /user/123,但那个 123 不是给构造函数的,是给 view() 的。漏掉这层区分,调试时会反复怀疑路由没生效。


















