Estendendo o CodeIgniter: como adicionar novas funcionalidades ao framework

21 de novembro de 2011, em Dicas, Passos Iniciais, por

Lembrando das lições básicas sobre controllers no CodeIgniter, vimos que, quando criamos um novo controller para um projeto, devemos estender o “CI_Controller”. Isso nada mais é do que PHP OO básico: uma classe estendendo outra para adquirir as propriedades e métodos permitidos.

Seguindo a OO, o CodeIgniter permite, de forma bastante simples, estender suas principais classes, adicionando ou substituindo funcionalidades a suas classes de sistema ou, como mais comumente conhecidas, core classes.

Toda vez que o CodeIgniter roda, essas core classes são iniciadas automaticamente (por serem essenciais ao funcionamento do framework) e, ao estender ou modificar alguma funcionalidade delas, a modificação é iniciada também automaticamente, conferindo um nível de adaptação e flexibilidades incríveis a qualquer projeto! Estas são as core classes que são chamadas toda vez que o CI roda (localizadas em /system/core):

  • Benchmark
  • Config
  • Controller
  • Exceptions
  • Hooks
  • Input
  • Language
  • Loader
  • Log
  • Output
  • Router
  • URI
  • Utf8


O “segredo” para estender/modificar estas classes está no diretório /application/core (veja o artigo sobre a estrutura de diretórios no CodeIgniter).

Estender as core classes do CodeIgniter

Em tempo oportuno serão mostradas, aqui no CodeIgniter Brasil, as funcionalidades de todas as classes do CodeIgniter. Por enquanto, basta saber que, mesmo suas funcionalidades padrão já serem poderosíssimas, é possível estendê-las, conferindo mais poder e flexibilidade no momento de desenvolver projetos.

Então, por exemplo, caso queira estender a classe de Input do CI (/system/core/Input.php), basta criar o arquivo /application/core/MY_Input.php e partir do seguinte ponto:

1
2
3
4
5
6
7
8
9
class MY_Input extends CI_Input {
 
    function __construct()
    {
        parent::__construct();
    }
 
    // Seu código aqui
}

A partir deste trecho de código, podemos deduzir 2 importantes informações:

  • Prefixo para o nome da classe. Ao estender uma core classe do CodeIgniter, é preciso que o nome da classe seja “prefixo” + “nome”, como no exemplo “MY_Input”.
  • Declaração “extends”. Sua classe deve, necessariamente, estender a classe-pai que se deseja manipular propriedades/métodos. No exemplo, a classe MY_Input estendeu a classe CI_Input (localizada em /system/core/Input.php).

Para quem já está familiarizado com PHP OO (o que, aliás, é um pré-requisito para se trabalhar com CI), a única novidade ficou por conta do prefixo necessário ao nome da classe. Como é de se esperar, caso você use um nome de método igual a algum já existem na core classe, toda a classe será substituída por suas novas instruções, portanto, atenção a isso!

Aliás, este prefixo pode ser outro, conforme sua vontade. Basta abrir o arquivo /application/config/config.php e alterar a diretiva “subclass_prefix” – por razões óbvias, não é possível alterar para “CI_”…

Substituir as core classes do CodeIgniter

Só substitua uma classe inteira do CodeIgniter se você realmente souber o que está fazendo!

Para substituir as core classes do CodeIgniter, basta criar um arquivo com o mesmo nome da “classe alvo”. Por exemplo, para substituir a classe de Input, basta criar o arquivo /application/core/Input.php com o seguinte código-base:

1
2
3
class CI_Input {
    // seu código aqui
}

O prefixo “CI_” é necessário para que o framework entenda do que se trata. Então, para substituir as core classes, basta seguir este modelo acima, sempre lembrando de usar o prefixo indicado.

3 comentários em "Estendendo o CodeIgniter: como adicionar novas funcionalidades ao framework"

gravatar

Felipe  em 15 de outubro de 2012

Parabéns pelo post e pelo site, me ajudou muito a iniciar e desenvolver em code igniter. Ja posso dizer que nao sou um ignorante no assunto. haha

gravatar

Vijay  em 14 de dezembro de 2015

Please help!I can’t create tabels..this errors appear:( ! ) Fatal error: Uncaught exception Doctrine_Connection_Exception’ with message PDO Connection Error: SQLSTATE[42000] [1049] Unknown database ci_doctrine in C:\wamp\www\ci_doctrine\system\application\plugins\doctrine\lib\Doctrine\Connection.php on line 480( ! ) Doctrine_Connection_Exception: PDO Connection Error: SQLSTATE[42000] [1049] Unknown database ci_doctrine’ in C:\wamp\www\ci_doctrine\system\application\plugins\doctrine\lib\Doctrine\Connection.php on line 480

Comente!