This repository was archived by the owner on May 7, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
CodeIgniter Rest API 설정하기
INMD1 edited this page Nov 13, 2024
·
2 revisions
우리가 DB에 접속해서 DB의 내용을 가져오거나 변경할 하기 위해서는 1차 적으로 Model 파일에 정의를 먼저 해줘야 한다
예시로 로그인 페이지를 만드는걸 참조 하겟다.
API 폴더 안에 UserModel.php 하나를 생성한다.
<?php namespace App\Models; use CodeIgniter\Model; class UserModel extends Model { protected $table = 'users'; protected $primaryKey = 'id'; protected $allowedFields = ['email', 'name', 'phone_number', 'student_id', 'username', 'password']; protected $useTimestamps = true; protected $dateFormat = 'datetime'; protected $createdField = 'created_at'; protected $updatedField = 'updated_at'; protected $beforeInsert = ['hashPassword']; protected $beforeUpdate = ['hashPassword']; protected function hashPassword(array $data) { if (isset($data['data']['password'])) { $data['data']['password'] = password_hash($data['data']['password'], PASSWORD_DEFAULT); } return $data; } }
우리가 마이크레이션을 하고 모델을 정의 햇으면 다음 단계인 컨트롤러에서 AuthController.php파일을 생성하고 수정한다. -> 아래코드는 우리가 로그인할대 JWT를 발급해서 인증관리 해주는 코드이다.
<?php namespace App\Controllers; use App\Models\UserModel; use CodeIgniter\RESTful\ResourceController; use Firebase\JWT\JWT; class AuthController extends ResourceController { public function register() { $rules = [ 'email' => 'required|valid_email|is_unique[users.email]', 'name' => 'required', 'phone_number' => 'required', 'student_id' => 'required|is_unique[users.student_id]', 'username' => 'required|is_unique[users.username]', 'password' => 'required|min_length[6]', ]; if (!$this->validate($rules)) { return $this->fail($this->validator->getErrors()); } $model = new UserModel(); $data = [ 'email' => $this->request->getVar('email'), 'name' => $this->request->getVar('name'), 'phone_number' => $this->request->getVar('phone_number'), 'student_id' => $this->request->getVar('student_id'), 'username' => $this->request->getVar('username'), 'password' => $this->request->getVar('password'), ]; $user_id = $model->insert($data); $data['id'] = $user_id; unset($data['password']); return $this->respondCreated($data); } public function login() { $model = new UserModel(); $username = $this->request->getVar('username'); $password = $this->request->getVar('password'); $user = $model->where('username', $username)->first(); if (!$user || !password_verify($password, $user['password'])) { return $this->failUnauthorized('Invalid credentials'); } $key = getenv('JWT_SECRET'); $payload = [ 'iat' => time(), 'exp' => time() + 3600, 'uid' => $user['id'], 'email' => $user['email'], ]; $token = JWT::encode($payload, $key, 'HS256'); return $this->respond(['token' => $token]); } }
그다음 사용자 정보 관리 API를 추가합니다. 파일명은 UserController.php
<?php namespace App\Controllers; use App\Models\UserModel; use CodeIgniter\RESTful\ResourceController; class UserController extends ResourceController { protected $model; public function __construct() { $this->model = new UserModel(); } public function index() { $users = $this->model->findAll(); return $this->respond($users); } public function show($id = null) { $user = $this->model->find($id); if (!$user) { return $this->failNotFound('User not found'); } return $this->respond($user); } public function update($id = null) { $user = $this->model->find($id); if (!$user) { return $this->failNotFound('User not found'); } $data = $this->request->getJSON(); if (!$this->model->update($id, $data)) { return $this->fail($this->model->errors()); } return $this->respond($this->model->find($id)); } public function delete($id = null) { $user = $this->model->find($id); if (!$user) { return $this->failNotFound('User not found'); } if ($this->model->delete($id)) { return $this->respondDeleted(['id' => $id]); } return $this->fail('Failed to delete the user'); } }
우리가 이때까지 설정한 것들을 라우터에서 설정해서 데이터가 잘 처리되게 만든다
$routes->post('register', 'AuthController::register'); $routes->post('login', 'AuthController::login'); $routes->group('users', ['filter' => 'auth'], function($routes) { $routes->get('', 'UserController::index'); $routes->get('(:num)', 'UserController::show/1ドル'); $routes->put('(:num)', 'UserController::update/1ドル'); $routes->delete('(:num)', 'UserController::delete/1ドル'); });