Criando uma API com o CodeIgniter 4

Neste post vou mostrar como criar uma simples API Rest com o framework PHP CodeIgniter 4.

Passo 1: Criar o banco de dados

Neste exemplo criarei um banco de dados no MySQL com nome “tutorial”, para criar basta usar este comando:

CREATE DATABASE tutorial;

Também criarei uma tabela Livro neste banco de dados:

USE tutorial;

CREATE TABLE livro (
  id INT NOT NULL AUTO_INCREMENT,
  descricao VARCHAR(50) NOT NULL,
  valor DOUBLE NOT NULL,
  autor VARCHAR(20) NOT NULL,
  PRIMARY KEY(id)
);

O próximo passo é popular a tabela com alguns livros, é só rodar o código abaixo:

INSERT INTO livro (descricao, valor, autor) VALUES
('1984' , 21.01, 'George Orwell'),
('Admirável Mundo Novo' , 25.40, '‎Aldous Huxley'),
('Fahrenheit 451' , 24.51, '‎Ray Bradbury');

Passo 2: Baixar e configurar o CodeIgniter 4

Agora basta entrar no site oficial do CodeIgniter 4 (https://codeigniter.com), baixar a última versão (neste momento 4.0.4) e extrair em um diretório.

Depois disto é necessário entrar no diretório do projeto e alterar o nome do arquivo “env” para “.env”, editar este arquivo removendo os comentários das linhas abaixo e inserindo os seguintes parâmetros:

database.default.hostname = localhost
database.default.database = tutorial
database.default.username = root
database.default.password = root
database.default.DBDriver = MySQLi

Lembrando que os campos de usuário e senha do banco devem estar corretos conforme configurado no MySQL da máquina.

Passo 3: Criar o Model

A próxima etapa é criar o model conforme a tabela que criei, no diretório app/Models criar um arquivo chamado LivroModel.php e inserir os seguintes códigos:

<?php namespace App\Models;
  
use CodeIgniter\Model;
  
class LivroModel extends Model
{
    protected $table = 'livro';
    protected $primaryKey = 'id';
    protected $allowedFields = ['descricao','valor', 'autor'];
    protected $validationRules    = [
        'descricao'     => 'required|max_length[50]',
        'valor'         => 'required|decimal',
        'autor'         => 'required|max_length[20]'       
    ];
}
 

Passo 4: Criar o Controller

O próximo passo é gerar o controller, no diretório app/Controllers criar o arquivo Livros.php com o código abaixo:

<?php namespace App\Controllers;
 
use CodeIgniter\RESTful\ResourceController;
use CodeIgniter\API\ResponseTrait;
use App\Models\LivroModel;
 
class Livros extends ResourceController
{
    use ResponseTrait;
    // lista todos livros
    public function index()
    {
        $model = new LivroModel();
        $data = $model->findAll();
        return $this->respond($data);
    }
 
    // lista um livro
    public function show($id = null)
    {
        $model = new LivroModel();
        $data = $model->getWhere(['id' => $id])->getResult();

        if($data){
            return $this->respond($data);
        }
        
        return $this->failNotFound('Nenhum dado encontrado com id '.$id);        
    }
 
    // adiciona um livro
    public function create()
    {
        $model = new LivroModel();
        $data = $this->request->getJSON();

        if($model->insert($data)){
            $response = [
                'status'   => 201,
                'error'    => null,
                'messages' => [
                    'success' => 'Dados salvos'
                ]
            ];
            return $this->respondCreated($response);
        }

        return $this->fail($model->errors());
    }
    
    // atualiza um livro
    public function update($id = null)
    {
        $model = new LivroModel();
        $data = $this->request->getJSON();
        
        if($model->update($id, $data)){
            $response = [
                'status'   => 200,
                'error'    => null,
                'messages' => [
                    'success' => 'Dados atualizados'
                    ]
                ];
                return $this->respond($response);
            };

            return $this->fail($model->errors());
        }
 
    // deleta um livro
    public function delete($id = null)
    {
        $model = new LivroModel();
        $data = $model->find($id);
        
        if($data){
            $model->delete($id);
            $response = [
                'status'   => 200,
                'error'    => null,
                'messages' => [
                    'success' => 'Dados removidos'
                ]
            ];
            return $this->respondDeleted($response);
        }
        
        return $this->failNotFound('Nenhum dado encontrado com id '.$id);        
    }
 
}

Abaixo uma breve explicação do funcionamento dos métodos deste controller:

index() – É usado para listar todos os livros.
create() – Este método é usado para adicionar um livro.
update() – Este é usado para alterar um livro existente.
show() – É usado para listar apenas um livro.
delete() – Este método é usado para remover um livro.

Passo 5: Configurando a rota para o endpoint

O próximo passo é criar as rotas do endpoint, para isso o CodeIgniter 4 disponibiliza o recurso Resource Routes que cria automagicamente as rotas mais usadas por um CRUD.

Para isso é só alterar a seguinte linha no arquivo Routes.php dentro da pasta app/Config:

$routes->get('/', 'Home::index');

Para esta:

$routes->resource('livros');

O framework cria as rotas com apenas essa linha, se fosse criar manualmente seria assim:

$routes->get('livros/new',             'Livros::new');
$routes->post('livros',                'Livros::create');
$routes->get('livros',                 'Livros::index');
$routes->get('livros/(:segment)',      'Livros::show/$1');
$routes->get('livros/(:segment)/edit', 'Livros::edit/$1');
$routes->put('livros/(:segment)',      'Livros::update/$1');
$routes->patch('livros/(:segment)',    'Livros::update/$1');
$routes->delete('livros/(:segment)',   'Livros::delete/$1');

Várias linhas de código a menos. 😀

Passo 6: Iniciar o servidor de desenvolvimento

Para iniciar o servidor embutido basta abrir o terminal (ou cmd), navegar até a pasta raiz do projeto e executar o comando:

php spark serve

Por padrão o servidor subirá o projeto no caminho http://localhost:8080.

Passo 6: Testando a API

A ultima etapa é testar a API com algum programa cliente de API, eu utilizarei o Postman que é um dos mais populares.

Para listar o livros basta selecionar o verbo GET e na URL colocar http://localhost:8080/livros/

Imagem mostrando o GET sendo utilizado no Postman, e retornando os dados dos livros no formato JSON.

Após clicar em “Send” será exibido o JSON com todos os livros cadastrados.

Para listar apenas um livro, é preciso editar a URL, especificando o id no final:

Imagem mostrando o GET sendo utilizado no Postman, e retornando o dado do livros no formato JSON.

Para adicionar um novo livro, basta colocar no verbo POST, apontar a URL novamente para http://localhost:8080/livros/, na aba Body especificar raw e tipo JSON, no corpo especificar os dados descricao, valor e autor conforme a imagem:

Imagem mostrando o POST sendo utilizado no Postman, enviando os dados em JSON e retornando status 200 (dados salvos).

Para alterar um livro existente, é necessário colocar o verbo PUT, colocar o id do livro existente no final da URL e no Body colocar os dados em JSON com os campos descricao, valor e autor com os novos dados:

Imagem mostrando o PUT sendo utilizado no Postman, enviando os dados alterados em JSON e retornando status 200 (dados atualizados).

E por fim, para excluir um livro, é só escolher o verbo DELETE e e especificar o id do livro a ser removido no fim da URL:

Imagem mostrando o DELETE sendo utilizado no Postman e retornando status 200 (dados removidos).

Conclusão:

Neste tutorial mostrei como criar uma simples API Restfull com o CodeIgniter 4, deixando o desenvolvimento bem rápido.

Referências:

https://codeigniter.com/user_guide/index.html

https://www.tutsmake.com/codeigniter-4-rest-api-example-tutorial/