Como criar bibliotecas (libraries) no CodeIgniter

19 de dezembro de 2011, em Passos Iniciais, por

Como criar bibliotecas (libraries) no CodeIgniter: imagem ilustrativa

Bibliotecas (ou libraries) no CodeIgniter são importantíssimas, pois, através delas, podemos estender recursos do framework, seja criando nossas próprias bibliotecas ou pegando recursos já prontos disponibilizados pela comunidade. Para o primeiro caso, aprenda como criar bibliotecas no CodeIgniter e veja como essa criação é simples e fácil de ser feita.

O que são as bibliotecas no CodeIgniter

Bibliotecas no CodeIgniter nada mais são do que classes PHP localizadas em /application/libraries. Perceba que existe, também, a pasta /system/libraries/, mas como foi visto no artigo sobre a estrutura de diretórios do CodeIgniter, dentro de /system ficam os arquivos de core do CI, portanto, é prudente mexer ali somente quando realmente souber o que está fazendo.

Fique sabendo, também, que, caso crie uma biblioteca com o mesmo nome de alguma biblioteca nativa do CodeIgniter, esta será sobreescrita pelo seu código! Tenha muita atenção!

Convenções sobre libraries no CodeIgniter

Em relação a bibliotecas no CI, com exceção das que são para mexer com bancos de dados, é possível:

  • Criar novas bibliotecas
  • Estender bibliotecas nativas
  • Sobreescrever bibliotecas nativas (!)

Como vimos, os arquivos devem ser criados em /application/libraries e seguir as seguintes convenções:

  • O nome deve capitalizado. Por exemplo: Minhalib.php
  • A declaração da classe também: class Minhalib
  • O nome do arquivo e da classe devem ser o mesmo (vide exemplos acima)

Veja este protótipo de como deve ser uma library no CodeIgniter:

1
2
3
4
5
6
7
8
9
10
11
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class Minhalib {
    public function __construct()
    {
    }
 
    [...]
}
 
/* End of file Minhalib.php */

E pronto! Já temos uma biblioteca pronta e já podemos usá-la em nossa aplicação! Para usar, você já sabe, basta seguir o que foi explicado no artigo “Carregando bibliotecas (libraries) no CodeIgniter“. Em um controller, basta usar:

1
$this->load->library('minhalib'); // Em minúsculo, mesmo

E, depois, usar quaisquer funções que sua library contenha. Vamos passar nosso modelo para o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class Minhalib {
    public function __construct()
    {
    }
 
    public function ola_mundo()
    {
        return 'Ol&aacute; mundo!';
    }
}
 
/* End of file Minhalib.php */

Então, depois de carregar a biblioteca, para se usar a função ola_mundo(), basta codificar:

1
$this->minhalib->ola_mundo(); // Sempre em minúsculo

No caso, como temos um retorno em texto, caso fosse preciso escrever esse retorno:

1
echo $this->minhalib->ola_mundo();

Passando parâmetros no carregamento da biblioteca

É bastante comum ser preciso passar alguns parâmetros na invocação de uma biblioteca. Evidentemente o CI permite fazer isso de uma maneira bastante simples. Primeiramente, vamos preparar nossa classe para receber parâmetros:

1
2
3
4
5
6
7
8
9
10
11
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class Minhalib {
    public function __construct($parametros)
    {
    }
 
    [...]
}
 
/* End of file Minhalib.php */

Com isso feito, os $parametros passados o devem ser através de um array (chave/valor). Dessa maneira, na inicialização da classe teríamos algo como:

1
$this->load->library('minhalib', array('chave1' => 'valor1', 'chave2' => 'valor2'));

Ou, para facilitar a leitura e entendimento posteriores:

1
2
$parametros = array('chave1' => 'valor1', 'chave2' => 'valor2');
$this->load->library('minhalib', $parametros);

Então, você pode fazer o que quiser com esses parâmetros. Só por curiosidade, execute o código acima depois de mudar a biblioteca para:

1
2
3
4
5
6
class Minhalib {
    public function __construct($parametros)
    {
        print_r($parametros);
    }
}

Usando recursos do CodeIgniter em bibliotecas

É perfeitamente possível (e frequentemente necessário) utilizar recursos nativos do CodeIgniter em bibliotecas que criamos. Mas, para isso, é preciso fazer uma coisinha antes. Como foi visto anteriormente, para chamarmos algum recurso do CI devemos nos valer de funções usando o $this, mas, no contexto de criação/edição de bibliotecas, isso não funciona; o $this só funciona, por padrão, para models, views e controllers.

Então, para se usar recursos nativos do CodeIgniter em bibliotecas próprias, é preciso atribuir por referência o super objeto do CodeIgniter a uma variável:

1
$CI =& get_instance();

A partir de então, temos acesso a todos os recursos nativos usando a variável $CI (ou qualquer outro nome que você queira):

1
2
3
$CI->load->helper('url');
$CI->load->library('session');
[...]

Estendendo bibliotecas nativas do CodeIgniter

Foi explicado no artigo sobre MY_Controller que é possível estender o “controller base” CI_Controller. O mesmo raciocínio se aplica para o caso de ser preciso estender libraries nativas do CI e, para se fazer isso, é um processo tão simples quanto.

Por exemplo, caso queiramos estender as funcionalidades da library nativa de e-mails, nos valemos do já conhecido prefixo de subclasse “MY_” (ou o que você tenha definido em /application/config/config.php):

1
2
3
4
5
6
class MY_Email extends CI_Email {
    public function minha_funcao()
    {
        [...]
    }
}

E, para os (não raros) casos em que é preciso chamar o construtor da superclasse na inicialização da biblioteca:

1
2
3
4
5
6
7
8
9
10
11
class MY_Email extends CI_Email {
    public function __construct()
    {
        parent::__construct();
    }
 
    public function minha_funcao()
    {
        [...]
    }
}

Feitos os devidos acréscimos de funcionalidades, a chamada para a biblioteca e o uso das funções não se altera em nada:

1
2
$this->load->library('email'); // SEM o prefixo "MY_"
$this->email->minha_funcao();

Simples, rápido, objetivo, enfim, nenhum mistério no mundo PHP OO!

Conclusão

Como vimos, criar bibliotecas no CodeIgniter é bastante simples. Seguindo algumas pequenas convenções de localização e nomenclatura, é possível criar funcionalidades espetaculares e/ou estender as (também espetaculares) funcionalidades do CI. Afinal, é para isso que serve um framework! Sua produtividade agradece!

Ah, e espero que você tenha notado o quão fácil é integrar classes feitas em PHP puro ao CodeIgniter, simplesmente as “transformando” em bibliotecas do framework! ;-)

7 comentários em "Como criar bibliotecas (libraries) no CodeIgniter"

gravatar

Rafael Fragoso  em 28 de fevereiro de 2012

Agora na nova versão do CodeIgniter é obrigatório colocar "CI_" antes do nome da classe: class CI_Teste.

gravatar

Tárcio Zemel  em 28 de fevereiro de 2012

Para libraries, não.

gravatar

Francis  em 12 de maio de 2012

Antes do nome da classe? 0o
Criei uma classe qualquer :

class Helloworld extends CI_Controller { }

A obrigatoriedade vem em extender à classe.
Uma obrigatoriedade sempre presente no CodeIgniter é o uso de My_ para libraries próprias.

gravatar

Odirlei  em 5 de setembro de 2012

Olá Tárcio e Francis,

Em minhas librarys que crio não coloco o My_ e funciona normalmente, utilizo o CI 2.1.2.

Agora minha dúvida é a seguinte:
- Preciso trazer dados do banco para minha library, eu crio um model para minha library ou faço direto na library?

Abraço,
Odirlei

gravatar

Tárcio Zemel  em 6 de setembro de 2012

Se você precisa puxar coisas do BD direto da library, eu faria diretamente lá. Agora, se a função já existe em algum outro model, só instancia e parte pro abraço! B-)

gravatar

Francis  em 31 de julho de 2013

Tárcio, em outro tópico eu comentei sobre o uso do MY_Controller.
Me responda algo, uma library pode também herdar métodos e funções do CI_Controller, por exemplo?

Sei lá, algo como $controller = new Controller('Usuario');

ou herdar métodos e funções do core:

class smtpEmail extends Email

Não precisa necessariamente ser o MY_Email pra isso certo?

Explique um pouco isso pra gente.

Gosto de testar tudo em meu pequeno laboratório em casa e estou com dúvidas sobre isso.

gravatar

Gilberto  em 23 de maio de 2015

É correto ou está de acordo com a convenção chamar uma função no _construct assim?
$autoload['libraries'] = array('session','Restrito'); // Carego a library

No meu Controller

$this->Restrito->verificar($this->router->class, $this->router->method);

Sou obrigado por o _construct na criação da biblioteca? Porque vejo em aguns exemplos o pessoal por o super objeto $CI =& get_instance(); no _contruct e na função

Vi que posso passa parâmetro para a library, logo, pensei não quebrar nenhuma regra com este processo.

    Comente!