Crear una API en Codeigniter
Per crear una API Restful primer serà necessari crear un controlador de codeigniter indicant que aquest és un controlador de tipus restful amb el paràmetre --restful, així mateix per mantenir tots els controladors i moduls correctament etiquetats es molt recomanable que els arxius/classes tinguin com a suffix de quin tipus d'element es tracta (controller, model, migration...)
php spark make:controller ApiNoticies --suffix --restfulCodi generat
<?php
namespace App\Controllers;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\RESTful\ResourceController;
class ApiNoticiesController extends ResourceController
{
/**
* Return an array of resource objects, themselves in array format.
*
* @return ResponseInterface
*/
public function index()
{
//
}
/**
* Return the properties of a resource object.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function show($id = null)
{
//
}
/**
* Return a new resource object, with default properties.
*
* @return ResponseInterface
*/
public function new()
{
//
}
/**
* Create a new resource object, from "posted" parameters.
*
* @return ResponseInterface
*/
public function create()
{
//
}
/**
* Return the editable properties of a resource object.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function edit($id = null)
{
//
}
/**
* Add or update a model resource, from "posted" properties.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function update($id = null)
{
//
}
/**
* Delete the designated resource object from the model.
*
* @param int|string|null $id
*
* @return ResponseInterface
*/
public function delete($id = null)
{
//
}
}El codi que es genera es correspon a un controlador de tipus ResourceController amb les funcions:
- index: Obtenir tots els elements
- show (id): Obtenir un element concret
- new: Crear un nou element buit
- create: Afegir un nou element
- edit (id): Obtenir un element per editar-lo
- update (id): Desar un element despres editar-lo
- delete (id): Eliminar un element
Exemple
/**
* Return an array of resource objects, themselves in array format
*
* @return mixed
*/
public function index()
{
$model = new NewsModel();
$response = [
'status' => 200,
"error" => false,
'messages' => 'News list',
'data' => $model->findAll()
];
return $this->respond($response);
}
/**
* Return the properties of a resource object
*
* @return mixed
*/
public function show($id = null)
{
$model = new NewsModel();
$data = $model->find($id);
if (!empty($data)) {
$response = [
'status' => 200,
"error" => false,
'messages' => 'Single news data',
'data' => $data
];
} else {
$response = [
'status' => 500,
"error" => true,
'messages' => 'No news found',
'data' => []
];
}
return $this->respond($response);
}
/**
* Create a new resource object, from "posted" parameters
*
* @return mixed
*/
public function create()
{
$rules = [
'title' => 'required|min_length[3]|max_length[128]',
'body' => 'required',
];
$messages = [
"body" => [
"required" => "Cos de noticia necessari"
],
"title" => [
"required" => "Titol noticia necessari",
"min_length" => "Titol massa curt",
"max_length" => "Titol massa llarg"
],
];
if (!$this->validate($rules, $messages)) {
$response = [
'status' => 500,
'error' => true,
'message' => $this->validator->getErrors(),
'data' => []
];
} else {
$model = new NewsModel();
$title = $this->request->getVar('title');
$slug = url_title($title);
$body = $this->request->getVar('body');
$newId = $model->addNoticia($title, $slug, $body);
$response = [
'status' => 200,
'error' => false,
'message' => 'News added successfully',
'data' => [
'id' => $newId,
'title' => $title,
'slug' => $slug,
'body' => $body
]
];
}
return $this->respondCreated($response);
}
/**
* Add or update a model resource, from "posted" properties
*
* @return mixed
*/
public function update($id = null)
{
$rules = [
'title' => 'required|min_length[3]|max_length[128]',
'body' => 'required',
];
$messages = [
"body" => [
"required" => "Cos de noticia necessari"
],
"title" => [
"required" => "Titol noticia necessari",
"min_length" => "Titol massa curt",
"max_length" => "Titol massa llarg"
],
];
if (!$this->validate($rules, $messages)) {
$response = [
'status' => 500,
'error' => true,
'message' => $this->validator->getErrors(),
'data' => []
];
} else {
$model = new NewsModel();
if ($model->find($id)) {
$title = $this->request->getVar('title');
$slug = url_title($title);
$body = $this->request->getVar('body');
$model->updateNoticia($id, $title, $slug, $body);
$response = [
'status' => 200,
'error' => false,
'message' => 'News updated successfully',
'data' => [
'id' => $id,
'title' => $title,
'slug' => $slug,
'body' => $body
]
];
} else {
$response = [
'status' => 500,
"error" => true,
'messages' => 'No news found',
'data' => []
];
}
}
return $this->respondUpdated($response);
}
/**
* Delete the designated resource object from the model
*
* @return mixed
*/
public function delete($id = null)
{
$model = new NewsModel();
$data = $model->find($id);
if (!empty($data)) {
$model->where(['id' => $id])->delete();
$response = [
'status' => 200,
"error" => false,
'messages' => 'News deleted successfully',
'data' => []
];
} else {
$response = [
'status' => 500,
"error" => true,
'messages' => 'No news found',
'data' => []
];
}
return $this->respondDeleted($response);
}Un cop generat el controlador, cal crear les rutes dins l'arxiu App/Config/Routes.php com qualsevol altra crida. Aquestes rutes es poden crear emprant routes->resources o routes->get/post/...
//***************************************************************************
// Agrupant les crides amb el nom de la funció list/add/show...
// NOTA: No segueix el criteri RESTFUL
$routes->group("news", function($routes){
$routes->get("list", "ApiNoticiesController::index");
$routes->post("add", "ApiNoticiesController::create");
$routes->get("show/(:num)", "ApiNoticiesController::show/$1");
$routes->put("update/(:num)", "ApiNoticiesController::update/$1");
$routes->delete("delete/(:num)", "ApiNoticiesController::delete/$1");
});
//***************************************************************************
// Crear les rutes amb el nom del recurs 'news' i actuar segons el HTTP Method
$routes->get ("news", "ApiNoticiesController::index");
$routes->post ("news", "ApiNoticiesController::create");
$routes->get ("news/(:num)", "ApiNoticiesController::show/$1");
$routes->put ("news/(:num)", "ApiNoticiesController::update/$1");
$routes->delete("news/(:num)", "ApiNoticiesController::delete/$1");
//***************************************************************************
// Emprar el objecte/funcio resource que crea totes les rutes automaticament
$routes->resource('news', ['controller' => 'ApiNoticiesController']);
// Aquesta ruta equivaldria al següent:
$routes->get('news/new', 'ApiNoticiesController::new');
$routes->post('news', 'ApiNoticiesController::create');
$routes->get('news', 'ApiNoticiesController::index');
$routes->get('news/(:segment)', 'ApiNoticiesController::show/$1');
$routes->get('news/(:segment)/edit', 'ApiNoticiesController::edit/$1');
$routes->put('news/(:segment)', 'ApiNoticiesController::update/$1');
$routes->patch('news/(:segment)', 'ApiNoticiesController::update/$1');
$routes->delete('news/(:segment)', 'ApiNoticiesController::delete/$1');