codeigniter 4 不提供 match() 方法;推荐为不同 http 动词分别定义路由,如 $routes->get() 和 $routes->post();也可用 $routes->add() 统一路由并在控制器中通过 $this->request->getmethod() 分支处理。

CodeIgniter 并没有内置的 match() 方法用于匹配多种请求方式。
你可能混淆了几个概念:
- CodeIgniter 4 的路由系统支持按 HTTP 动词(GET、POST、PUT、DELETE 等) 显式声明路由;
- 它不提供类似
match(['get', 'post'])这样的方法(那是 Laravel 或某些其他框架的写法); - 但你可以通过 多次调用对应动词方法,或使用
add()+ 条件判断,实现等效效果。
下面说清楚怎么在 CI4 中处理多种请求方式的路由匹配:
如何为同一 URL 支持 GET 和 POST
直接分别注册两个路由即可,这是推荐做法:
$routes->get('contact', 'Contact::index');
$routes->post('contact', 'Contact::handle');
这样 /contact 走 GET 时显示表单,走 POST 时提交处理,语义清晰、安全可控。
如果确实想复用同一个控制器方法处理多方法
可以统一指向一个方法,在方法内部判断请求类型:
// 路由定义(接受所有方法)
$routes->add('api/data', 'Api::handler');
// 控制器中
public function handler()
{
if ($this->request->getMethod() === 'get') {
return $this->showData();
} elseif ($this->request->getMethod() === 'post') {
return $this->saveData();
} elseif ($this->request->getMethod() === 'put') {
return $this->updateData();
}
}
使用 add() 配合正则或通配符(进阶)
CI4 的 add() 方法支持自定义匹配逻辑,但需手动检查 $this->request:
$routes->add('submit', function () {
$method = service('request')->getMethod();
if (in_array($method, ['get', 'post', 'put'])) {
return \App\Controllers\Submit::handle();
}
throw new \CodeIgniter\Exceptions\PageNotFoundException();
});
注意:这种方式绕过了标准控制器自动解析,需自行处理实例化和响应返回,一般不推荐,仅作特殊场景备用。
小结常见做法
- ✅ 推荐:为不同请求方式写独立路由,职责分明;
- ✅ 可行:用一个路由入口,方法内用
$this->request->getMethod()分支处理; - ❌ 不要找
match()方法——CI4 没有这个 API; - ⚠️ 自定义
add()回调较灵活但增加维护成本,非必要不用。
不复杂但容易忽略。











