Implementando Middlewares com Codeigniter 3

Mário LucasMário Lucas
3 min read

No CodeIgniter 3, não existe um sistema nativo de middlewares como em frameworks mais modernos, mas é possível implementar uma estratégia eficiente usando Hooks, Filters ou Libraries personalizadas. Aqui estão algumas abordagens para implementação desse recurso poderosos que são middlewares.


1. Usando Hooks

O CodeIgniter 3 tem um sistema de hooks que permite executar código antes e depois de certos eventos. Podemos criar um middleware usando o hook pre_controller, que é executado antes do carregamento do controlador para o exemplo vamos usar um sistema para verificar se o usuário está logado.

Passo 1: Ativar Hooks no Config

No arquivo application/config/config.php, ative os hooks:

$config['enable_hooks'] = TRUE;

Passo 2: Criar o Middleware como um Hook

Abra application/config/hooks.php e adicione:

$hook['pre_controller'][] = [
    'class'    => 'AuthMiddleware',
    'function' => 'handle',
    'filename' => 'AuthMiddleware.php',
    'filepath' => 'hooks',
    'params'   => []
];

Passo 3: Criar o Arquivo do Middleware

Crie o arquivo application/hooks/AuthMiddleware.php:

class AuthMiddleware
{
    public function handle(): void
    {
        $ci =& get_instance();

        $ci->load->library('session');

        if (!$ci->session->userdata('logged_in')) {
            redirect('login');
        }
    }
}

2. Usando um Controller Base

Outra opção é criar um controlador base e fazer com que todos os outros herdem dele, essa lógica me parece muito interessante quando temos regras para áreas distintas dentro de um sistema só com papeis diversos, como por exemplo: Admin que gerencia tenants, tenants e clientes do tenant por exemplo.

Então poderia ter um CI_Tenant_Controller, CI_Admin_Controller e um CI_Client_Controller e tem middlewares e validações para cada ambiente com suas necessidades de validação.

Passo 1: Criar o Controller Base

Crie application/core/CI_Tenant_Controller.php:

class CI_Tenant_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        // nossas verificações vão aqui para os tenants
        $this->checkAuth();
        $this->checkAccountDataCompleted();
        $this->checkIsDefaulter();
    }

    private function checkAuth(): void
    {
        // ...
    }

    private function checkAccountDataCompleted(): void
    {
        //..
    }

    private function checkIsDefaulter(): void
    {
        //...
    }
}

Passo 2: Fazer os Controllers Herdarem CI_Tenant_Controller

Agora, qualquer controller que precise do middleware de tenant deve estender CI_Tenant_Controller:

class Dashboard extends CI_Tenant_Controller
{
    public function index(): void
    {
        echo "Bem-vindo ao painel!";
    }
}

3. Usando Libraries para Middleware Personalizado

Se quiser uma abordagem modular, você pode criar uma library para gerenciar autenticação e outras funções de middleware.

Passo 1: Criar a Library

Crie application/libraries/AuthMiddleware.php:

class AuthMiddleware
{
    private $ci;

    public function __construct()
    {
        $this->ci =& get_instance();
        $this->ci->load->library('session');
    }

    public function check() {
        if (!$this->ci->session->userdata('logged_in')) {

            redirect('login');
        }
    }
}

Passo 2: Chamar o Middleware nos Controllers

No controller, basta carregar a library:

class Dashboard extends CI_Controller
{    
    public function __construct()
    {
        parent::__construct();

        $this->load->library('AuthMiddleware');

        $this->authmiddleware->check();
    }

    public function index(): void
    {
        echo "Bem-vindo ao painel!";
    }
}

Qual estratégia escolher?

  • Usar Hooks → Se precisar de um middleware global sem modificar controllers.

  • Usar CI_Tenant_Controller → Se quiser um método direto e organizado e ainda flexível.

  • Usar Libraries → Se precisar de mais flexibilidade e reutilização do código.

Dependendo do desafio que você tem pela frente, você ainda pode combinar as abordagens.

0
Subscribe to my newsletter

Read articles from Mário Lucas directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Mário Lucas
Mário Lucas