MY_Controller : estendendo o CI_Controller

13 de setembro de 2011, em Passos Iniciais, por

MY_Controller : estendendo o CI_Controller

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!

11 comentários em "MY_Controller : estendendo o CI_Controller"

gravatar

Deives Fahl  em 13 de setembro de 2011

Com certeza muito útil!
Ótimo artigo Tárcio valeu!

gravatar

Fabio Teixeira  em 14 de setembro de 2011

Otimos post XD.
Depois, se nao for muito incomodo ,poderia falar sobre "Modular Extensions – HMVC" ?

gravatar

Tárcio Zemel  em 14 de setembro de 2011

Obrigado, Deives! Abraços!

gravatar

Tárcio Zemel  em 14 de setembro de 2011

Oi, Fabio!

Basta ler o artigo HMVC no CodeIgniter com Modular Extensions.

gravatar

Fabio Teixeira  em 20 de setembro de 2011

Opa, não tinha visto essa pagina antes.
Vlw XD.

gravatar

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.

gravatar

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

gravatar

Victor  em 18 de outubro de 2011

Eu fiz um post sobre extender a My_Model no meu blog

gravatar

Francis  em 12 de maio de 2012

Tácio, não tenho palavras a dizer, é fenomenal ;D

Sempre podemos testar funções e depois aplicá-las no My_Controller, como por exemplo a verificação de sessão ou manipulação de algo presente em toda uma aplicação.

Em cakePHP, o arquivo responsável por se criar algo assim é o app_controller.php.
*Você vai encontrar muito developer cakePHP por aqui a partir de hoje haha ;D

gravatar

Alexandre  em 13 de julho de 2012

isto pode ser usado apenas e controller?

gravatar

Francis  em 31 de julho de 2013

Tárcio, em alguns casos cidados acima, como o is_ajax(), etc, não seria melhor criar uma library?

Eu ainda não precisei criar um My_* controller, model, router nem nada, pois ainda não precisei manipular os métodos originais do core e sim eu apenas manipulo os métodos do php mesmo e transformo em funções para facilitar o uso nas views, controllers e models.

    Comente!