MY_Controller : estendendo o CI_Controller
13 de setembro de 2011, em Passos Iniciais, por Tárcio Zemel

Como já vimos no artigo sobre Controllers no CodeIgniter, todo controller que criamos deve estender o controller “original” CI_Controller:
class Usuario extends CI_Controller { // código } |
Isso é simplesmente PHP Orientado a Objetos no qual, no exemplo, a classe “Usuario” estende a classe “CI_Controller” para herdar os métodos e propriedades herdáveis (públicos e protegidos).
Como estamos falando do bom e “velho” PHP OO, pensem comigo: seria possível, também, estender o próprio CI_Controller, já que se trata, tão somente, de uma classe em PHP? A boa notícia é que, sim, é possível estender o CI_Controller e adicionar novas funcionalidades ao “controller-mor” do CodeIgniter!
MY_Controller
Podemos encontrar no arquivo principal de configuração do CodeIgniter, em /application/config/config.php a diretiva de qual é o prefixo a ser usado para estender classes nativas. Por padrão, é “MY_” (mas pode ser alterado):
$config['subclass_prefix'] = 'MY_'; |
Ou seja, quando queremos estender libraries nativas (e alguns outros recursos, também), usamos o prefixo especificado nesta diretiva.
Então para estender o CI_Controller, é preciso criar o arquivo /application/core/MY_Controller.php e usar o modelo:
class MY_Controller extends CI_Controller { // código } |
Se não, vejamos: já que estendemos o CI_Controller para usar métodos e propriedades gerais, não faz mais sentido os controllers “comuns” estenderem o CI_Controller, já que ele continua o mesmo da instalação original. Portanto, a partir do momento em que se quer estender as funcionalidades do CI usando esta técnica, todos os controller devem, a partir de agora, estender o MY_Controller!
Nosso exemplo mudaria para:
class Usuario extends MY_Controller { // código } |
Ficando com a seguinte hierarquia:
CI_Controller > MY_Controller > Usuario (e demais controllers) |
Benefícios de uso do MY_Controller
Ao usar o MY_Controller temos tantos benefícios quantos podem ser necessários/requeridos em um projeto. Obviamente esta técnica não é para ser usada sem critérios, mas alguns pontos são indicativos de quando devemos nos valer do MY_Controller:
- Se determinados métodos e/ou propriedades devem (ou tem a chance de ser) usados em muitos controllers
- Criação de métodos específicos que ajudarão e poderão ser usados em muitos controllers
- Variáveis (propriedades) usadas em todos ou muitos controllers
Porque, agora, os controllers do projeto que estendem o MY_Controller tem acesso a todas as funções e variáveis de CI_Controller e MY_Controller (conforme pode ser visto na representação da hierarquia acima). Vamos a um exemplo de uma função útil que pode constar no MY_Controller:
class MY_Controller extends CI_Controller { public function is_ajax() { return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'); } } |
Nisso, todos os controllers que estenderem o MY_Controller contarão com o método is_ajax(), que testa se a requisição à classe está sendo feita via AJAX ou não. Poderíamos ter, por exemplo, algo assim:
class Usuario extends MY_Controller { public function get_by_name() { if ($this->is_ajax()) { // Se for AJAX... } else { // Se não for AJAX... } } } |
Conclusão
Como pudemos ver, há casos em que todos ou a maioria dos controllers precisam acessar ou serem capazes de realizar determinados métodos e/ou ter determinadas propriedades em comum.
Caso seja esse seu caso, é possível facilitar a produção e a manutenção de códigos usando o MY_Controller!
8 comentários em "MY_Controller : estendendo o CI_Controller"
Fabio Teixeira em 14 de setembro de 2011
Otimos post XD.
Depois, se nao for muito incomodo ,poderia falar sobre "Modular Extensions – HMVC" ?
Tárcio Zemel em 14 de setembro de 2011
Obrigado, Deives! Abraços!
Tárcio Zemel em 14 de setembro de 2011
Oi, Fabio!
Basta ler o artigo HMVC no CodeIgniter com Modular Extensions.
Fabio Teixeira em 20 de setembro de 2011
Opa, não tinha visto essa pagina antes.
Vlw XD.
Felipe em 24 de setembro de 2011
Fala,
Bom post, o ci 2.0.3 veio que veio… Alias todos os posts são de ótima qualidade, sem enrolação e direto ao ponto. Uso o CI a uns 3 meses e é excelente, msm escrevendo um pouco mais que outros frames como simfony.
Mas te falar que tô tendo um probleminha com os routes[''] dele, se puder disponibilizar um artigo com este tema ficarei grato.
Valeu.
Felipe em 24 de setembro de 2011
:| a preguiça é tensa, já tem um post seu assim, vou dar uma lida… http://codeigniterbrasil.com/configuracoes/config…
Victor em 18 de outubro de 2011
Eu fiz um post sobre extender a My_Model no meu blog



Deives Fahl em 13 de setembro de 2011
Com certeza muito útil!
Ótimo artigo Tárcio valeu!