Ves al contingut principal

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 --restful
Codi 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');