如何从现有PHP CodeIgniter 2.1.3项目快速创建REST API端点?
快速为CodeIgniter 2.1.3项目创建API端点的方案
1. 在现有项目中新增独立API控制器
不用重构现有代码,直接在application/controllers下创建API专属控制器,专注返回JSON数据:
<?php class Api extends CI_Controller { public function __construct() { parent::__construct(); // 关闭CI的调试信息,避免干扰JSON输出 $this->output->enable_profiler(FALSE); // 允许跨域请求(如果前端部署在不同域名) header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); // 直接复用现有业务模型,避免重复逻辑 $this->load->model('User_model'); } // 示例:获取全部用户列表 public function users() { $users = $this->User_model->get_all_users(); echo json_encode(['status' => 'success', 'data' => $users]); } // 示例:获取单个用户详情 public function user($id) { $user = $this->User_model->get_user_by_id($id); if ($user) { echo json_encode(['status' => 'success', 'data' => $user]); } else { http_response_code(404); echo json_encode(['status' => 'error', 'message' => '用户不存在']); } } }
2. 配置API路由
在application/config/routes.php中添加API路由规则,让请求能正确映射到控制器方法:
$route['api/users'] = 'api/users'; $route['api/user/(:num)'] = 'api/user/$1';
之后就可以通过http://你的域名/api/users这类地址访问API了。
3. 处理不同请求类型与参数
针对POST/PUT/DELETE等操作,在控制器方法里判断请求类型,确保接口符合REST规范:
// 示例:创建新用户 public function create_user() { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['status' => 'error', 'message' => '不允许的请求方法']); return; } // 用CI自带方法获取POST参数 $user_data = [ 'name' => $this->input->post('name'), 'email' => $this->input->post('email') ]; $user_id = $this->User_model->insert_user($user_data); if ($user_id) { http_response_code(201); echo json_encode(['status' => 'success', 'user_id' => $user_id]); } else { http_response_code(500); echo json_encode(['status' => 'error', 'message' => '创建用户失败']); } }
对应的路由:
$route['api/user/create'] = 'api/create_user';
4. 复用现有业务逻辑,减少重复工作
直接加载项目中已有的Model类,避免重新编写数据操作代码。如果现有Model中存在和视图耦合的代码(比如输出HTML片段),可以抽离出纯数据操作的方法,或者新建一个基础Model封装通用CRUD逻辑,保证新旧逻辑一致。
5. 过渡到前后端分离的实操建议
- 先把核心业务模块封装成API,用新前端框架(Vue/React等)调用这些接口,逐步替换旧页面,避免一次性重构的风险。
- 待API稳定后,可以考虑将API层从CI2中剥离,迁移到更现代的框架(比如CodeIgniter 4、Laravel等),但在此之前保证现有业务正常运行。
- 务必添加基础安全验证:比如在API控制器的构造方法中检查请求头里的API密钥,防止非法访问:
public function __construct() { parent::__construct(); $api_key = $this->input->get_request_header('X-API-Key'); if ($api_key !== '你的专属密钥') { http_response_code(401); echo json_encode(['status' => 'error', 'message' => '未授权访问']); exit; } // 其他初始化操作... }
内容的提问来源于stack exchange,提问作者Abu Shoeb
相关产品推荐
相关产品推荐

