Como criar seu próprio Controller no CodeIgniter

Uma vez, um cliente me pediu um determinado sistema de cadastro de usuários, coisa simples, nada muito completo.

Então, saquei meu CodeIgniter do bolso e comecei o desenvolvimento.

Após vários dias e codificação e com o sistema caminhando para a sua conclusão, de repente, me pegando de surpresa o cliente chega com uma solicitação de última hora: então, vamos ter que fazer uma pequena modificação no sistema, coisa simples, ele vai ter que ter controle de login/senha. Isso é simples de fazer né? Né?

Então pensei comigo: sim, é simples de fazer, o problema é que é trabalhoso. Mas como diz o ditado, o cliente sempre tem razão, eu acho, resolvi atender o pedido do meu querido pagador.

Então, o que vamos ver hoje é: Como criar seu próprio Controller no CodeIgniter

Agora o que eu tinha que fazer era eu imaginar uma maneira de implementar isto no sistema de um jeito que não me desse tanto trabalho.

A minha lógica ficou assim: o que eu teria que fazer era colocar um código de verificação de sessão antes de cada controller inicializar, para assim eu saber se eu deveria direcionar o usuário para a tela de login ou deixá-lo continuar no sistema.

Depois de muito quebrar a cabeça cheguei à seguinte conclusão: como o CodeIgniter é orientado a objetos, posso usar dessa funcionalidade e implementar o que preciso.

A minha ideia era: todos os meus controllers estendiam o CI_Controller, que é o controller padrão do CodeIgniter. O que eu deveria fazer é basicamente inserir meu código entre o controller CI_Controller e os controllers que eu tinha criado.

Então o que eu fiz: criei um controller personalizado com o nome MY_Controller.php. Usei este nome por que é o nome padrão que o CodeIgniter sugere. Se quiser alterar isso, deve-se ir lá no arquivo application/config/config.php  e lá na linha 109, você vai encontrar a configuração do prefixo da sua subclasse:

$config['subclass_prefix'] = 'MY_';

Este controller era um controller padrão do CodeIgniter. Nenhuma novidade até aqui.

Mas o pulo do gato era a modificação que eu teria que fazer em todos os outros meus controllers.

Eu deveria entrar em cada um e mudar somente a classe que eles estavam estendendo.

Em vez de estender da classe CI_Controller, agora cada controller meu deveria estender o meu controller. Ou seja, ficaria assim:

class Welcome extends MY_Controller...

Com esta única mudança em todos os meus controllers, eu garantiria que sempre que algum controller fosse chamado, ele iria passar antes pelo MY_Controller, e no construct do MY_Controller eu colocaria meu código de verificação do login.

Apenas um detalhe: quando você criar o seu controller de login, este deve estender a classe CI_Controller normalmente, caso contrário você entrará em um loop.

Este controller deve ser salvo dentro da pasta application/core.

Veja abaixo o código deste controller:

<?php
class MY_Controller extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            
            $logado = $this->session->userdata('logado');
            if ($logado != 1)
              redirect(base_url('login'));

       }
}
?>

A linha parent::__construct(); é necessária pois precisamos das funções que são feitas no construc do CI_Controller.

A lógica que eu fiz ali é bem simples.

Criei um controller de login, onde a função index é a que traz por padrão a view de login. Na verificação acima somente verifico na sessão se a variável logado está com o valor 1. Caso sim, não faço nada, ou seja, a aplicação continua seu fluxo, caso não, então redireciono para o controller login.

Aqui é importante informar o nome do controller login, pois este controller estende o CI_Controller, já que você não vai verificar se o usuário está logado no controller de login, certo?

No controller de login o que você tem que verificar basicamente é se o usuário digitou seus dados de acesso corretos, então grave o valor 1 na variável ‘logado’, e verifique isto antes de cada controller.

E com isso eu consegui resolver o problema de login no meu sistema fazendo muito poucas alterações.  E inclusive, caso algum problema ocorra em relação aos logins, eu sei exatamente onde ir para tentar solucioná-lo.

Por fim, eu e meu cliente ficamos felizes. 🙂

Este é o fim do post de hoje.

Atenção! Coloque abaixo seu comentário sobre o que achou do post. Pode ser um elogio ou descendo a lenha. Isso serve para eu me guiar e saber se estou criando um conteúdo de qualidade.

Abraços

Fabio

Fábio S. Reszko

Sou Programador PHP desde 2006 e eu acredito sinceramente que programar usando um Framework PHP é a solução para os problemas de códigos desorganizados, difíceis de entender e de dar manutenção no futuro. Se você também acredita nisto, então fique à vontade em explorar meu blog.