Substituir e estender classes do Core de CodeIgniter

Como podemos modificar as classes que formam o núcleo de CodeIgniter para alterar significativamente a maneira de funcionar do framework PHP.

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 17/9/12
Valorize este artigo:
Uma característica de CodeIgniter que o diferencia de outros frameworks PHP é a possibilidade que oferece de mudar os modos de trabalho que inicialmente propõe aos desenvolvedores. Neste sentido, em CodeIgniter podemos fazer coisas tão críticas como modificar as próprias classes que fazem parte do "core" ou núcleo da aplicação.

Quando se coloca em funcionamento CodeIgniter existem varias classes que são carregadas automaticamente como núcleo de processo do framework. Essas classes são as que se denominam habitualmente o Core de CodeIgniter e nós podemos intercambiá-las por nossos próprios códigos, ou o que realmente seria mais comum, estendê-las com código adicional que realize funções que resultem críticas em nossas aplicações web.

Neste artigo do Manual de CodeIgniter mostraremos o modo de modificar o Core de CodeIgniter, para as pessoas que julguem que lhes pode ajudar nas suas tarefas de desenvolvimento.

Nota: Este é um artigo que poderíamos catalogar de avançado, de modo que o mais seguro é que não resulte neste momento muito interessante para as pessoas que estão dando seus primeiros passos com o framework. Não obstante, não quisemos pular o tema para seguir, na medida do possível, o roteiro do "User Guide" oficial de CodeIgniter.
Na prática, a maioria dos usuários não vai necessitar nunca alterar as classes do Core. Em alguns casos pode resultar interessante estender alguma das classes com código adicional, para dotá-las de algum método que resulte útil em determinadas aplicações. Do mesmo modo, antes de mudar qualquer coisa do Core de CodeIgniter, é importante que o desenvolvedor saiba o que está fazendo e saiba por que o está fazendo, à parte de que tenha certa experiência que o ajude a não estragar as classes mais fundamentais deste framework.

Listagem de classes do Core de CodeIgniter

Quando nos referimos ao Core de CodeIgniter, fazemos referência àquelas classes que são carregadas sempre que o framework é colocado em funcionamento. São as seguintes:

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

Substituir as classes do core com nossas próprias versões

A primeira possibilidade que existe é substituir completamente uma classe do Core por outra criada inteiramente por nós. Esta tarefa em principio é pouco aconselhável, além de requerer um nível muito maior do desenvolvedor que a está realizando, porque estaremos eliminando uma classe chave do framework e colocando um código nosso, que temos que assegurar-nos de que funciona e que realiza as tarefas para as que está desenhada a classe originalmente. De qualquer forma se realiza da seguinte maneira:

Primeiro temos que observar o nome da classe que queremos substituir, que pode ser qualquer das listadas antes. Em seguida temos que criar uma classe com o mesmo nome e colocá-la no diretório de "system/application/libraries".

Por exemplo, imaginemos que queremos substituir a classe "Config". Então criaríamos um arquivo em:

system/application/libraries/Config.php

Depois, o código a inserir neste arquivo seria o necessário para definir a classe que estamos substituindo, tendo em conta que o nome da classe a substituir deve ter o prefixo CI_. Vejamos o seguinte esquema:

class CI_Config {
   //Código de nossa nova classe Config
}

Estender o código de uma classe do Core

Esta segunda possibilidade resulta bastante mais interessante, pelo menos para usuários mais normais, posto que permite agregar funcionalidade às classes existentes no Core de CodeIgniter, sem alterar as coisas que já fazem originalmente.

Nota: Em minha segunda aplicação de CodeIgniter já acabou sendo interessante fazer alguma modificação da classe Controller, para lhe agregar alguns métodos que me resultava especialmente útil dispor em todos os controladores. Realmente, vendo o problema agora desde outra perspectiva, penso que talvez se pudesse ter colocado esses métodos em outras bibliotecas, mas terminei decidindo colocá-los na classe dos controladores e funcionou bem.

Estender uma classe se faz de maneira similar a substituí-la, com a diferença de que ao estendê-la temos que nos certificar de invocar o construtor da classe "parent" (classe que estamos estendendo) e que devemos utilizar um prefixo "MY_" tanto no nome do arquivo quanto no da classe.

Assim, vejamos como podemos estender, por exemplo, a classe Controller.

Teremos que criar um arquivo chamado MY_Controller.php que situaremos na rota system/application/libraries/MY_Controller.php. Seu código seria o seguinte:

<?php if (!defined('BASEPATH')) exit('Nao desejo permitir acesso direto a este script');

class MY_Controller extends Controller {
   
   //construtor, deve chamar o construtor da classe parent
   function MY_Controller(){
      parent::Controller();
   }

   function algo_importante_que_desejo_ter_sempre(){
      //código de uma função com a que estou estendendo meus controladores
   }

}

Como se pode ver, estamos estendendo a classe Controller e o mais importante é observar como no construtor fizemos uma chamada ao construtor da classe "parent", para que não se percam as tarefas de inicialização dos objetos que foram definidas nas classes do core que estamos estendendo.

Nota: Utilizamos no código deste caso o modelo de construtor de PHP 4, mas se poderia utilizar o de PHP 5,se quiséssemos.

Em seguida, nossos métodos terão qualquer nome que desejemos. Ademais, se quisermos substituir especificamente algum dos métodos que existiam na classe original, só temos que criar um novo método com o mesmo nome que tinha antes. Por exemplo, se criamos um método chamado index() na classe MY_Controller, estaremos substituindo o código desse método dos controladores originais.

Nota: Se quisermos, podemos mudar o prefixo "MY_" utilizado para as classes que estendem o core e isso se consegue a partir do arquivo de configuração, que está na rota "system/application/config/config.php", onde temos que alterar esta variável:
$config['subclass_prefix'] = 'MY_';






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato