Criando Bibliotecas
Quando utilizamos o termo "Bibliotecas", normalmente estamos nos referindo as clases localizadas no diretório libraries e descritas na seção Referências de Classes deste guia. Neste caso, porém, iremos mostrar como você pode criar suas próprias bibliotecas dentro de seu diretório application/libraries a fim de manter uma separação entre seus recursos locais e os recursos globais do framework.
Como bônus, o Code Igniter permite que suas bilbliotecas estender classes nativas se você simplismente precisar adicionar alguma funcionalidade para uma biblioteca existente. Você ainda pode sobrescrever as bibliotecas nativas pelas suas em seu diretório application/libraries.
Sumário:
- Você pode criar bibliotecas inteiramente novas.
- Você pode estender bibliotecas nativas.
- Você pode sobrescrever bibliotecas nativas.
O texto abaixo detalha estes três conceitos.
Note: As classes de Banco de Dados e as classes Controller principais não podem ser estendidas ou sobrescritas pelas classes que você criar. Mas todas as outras podem.
Armazenamento
Sua biblioteca de classes deve ser colocada em seu diretório application/libraries, pois este será o lugar onde o Code Igniter irá procurá-las quando foram inicializadas.
Convenções de Nomenclatura
- Nomes de arquivo devem ter sua inicial maiúscula. Por exemplo: Minhaclasse.php
- Declarações de Classes devem ter sua inicial maiúscula. Por exemplo: class Minhaclasse
- Nomes de classes e nomes de arquivos devem ser iguais.
O arquivo de Classe
Classes devem ter este protótipo básico (Note: Estamos utilizando o nome Algumaclasse puramente como exemplo):
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Algumaclasse {
function some_function()
{
}
}
?>
Utilizando sua classe
De dentro de qualquer função Controller você pode inicializar suas classes utilizando o padrão:
$this->load->library('Algumaclasse');
Onde Algumaclasse é o nome do arquivo, sem a extensão ".php". Você pode dar submit no nome do arquivo como inicial maiúscula ou minúscula. O Code Igniter não se importa.
Uma vez carregada, você pode acessar sua classe utilizando a versão em caixa baixa:
$this->Algumaclasse->some_function(); // Instâncias de Objeto serão sempre em caixa baixa
Passando parâmetros ao inicializar sua classe
Em sua função de carregamento da biblioteca, você pode passar dados dinamicamente, através do segundo parâmetro, para seu construtor de classes:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('dinamicamente', $params);
Se você usar este recurso deve obrigatoriamente configurar seu construtor para esperar o dado:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Algumaclasse {
function Algumaclasse($params)
{
// Faça alguma coisa com o $params
}
}
?>
Você pode também passar parâmetros armazenados no arquivo de configuração. Simplesmente crie um arquivo config com nome idêntico ao do nome de arquivo da classe e salve-o em seu diretórioapplication/config/. Note que se você passar dinamicamente parâmetros, como descrito acima, a opção do arqivo config não estará disponível.
Utilizando os Recursos do Code Igniter dentro de sua Biblioteca
Para acessar os recursos nativos do Code Igniter dentro de sua biblioteca use a função get_instance(). Esta função retorna o super objeto Code Igniter.
Normalmente dentro de suas funções controller você poderá chamar qualquer função disponível no CI usando o construtor $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
$this, porém, apenas trabalha diretamente dentro de seus controllers, models ou views. Se você quiser usar as classes do Code Igniter dentro de suas próprias funções personalizadas, pode fazer da sequinte forma:
Primeiro, atribua o objeto Code Igniter a uma variável:
$CI =& get_instance();
Uma vez feito isto, você irá usar esta variável no lugar de $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
Note: Você irá notar que a função get_instance() acima está sendo passada por referência:
$CI =& get_instance();
Isto é muito importante. Atribuir por referência permite que você use o objeto Code Igniter original, ao invés de criar uma cópia dele.
Sobrescrevendo Bibliotecas Nativas por suas Próprias Versões
Simplesmente nomear seus aquivos de classe de forma idêntica à uma biblioteca nativa irá forçar o Code Igniter a usar aquele no lugar do nativo. Para usar este recurso você deve nomear o arquivo e a declaração da classe com o mesmo nome da biblioteca nativa. Por exemplo, para sobrescrever a biblioteca nativa Email crie um arquivo chamado application/libraries/Email.php, e declare sua variável como:
class CI_Email {
}
Note que a maioria das classes nativas contém o prefixo CI_.
Para carregar sua biblioteca use a função padrão:
$this->load->library('email');
Note: Até este momento as classes de Banco de Dados não podem ser sobrescritas pelas versões que você criar.
Estendendo Bibliotecas Nativas
Se tudo o que precisa é adicionar uma certa funcionalidade à uma biblioteca existente - talvez uma ou duas funções - então é desnecessário substituir a biblioteca inteira com sua versão. Neste caso, é melhor simplismente estender a classe. Estender uma classe é praticamente igual a substituí-la, com algumas exceções:
- A declaração da classe deve estender a classe pai.
- O novo nome de seu arquivo da classe devem conter o prefixo MY_ (este item é configurável. Veja abaixo.):
Por exemplo, para estender a classe Email nativa, você precisa criar um arquivo chamado application/libraries/MY_Email.php, e declarar sua classe com:
class MY_Email extends CI_Email {
}
Note: Se você precdisar usar um construtor em sua classe, tenha certeza de estender o construtor pai:
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
Carregando sua Subclasse
Para carregar sua subclasse você irá usar a sintaze padrão normalmente utilizada. NÂO INCLUA seu prefixo. Por exemplo, para carregar o exemplo acima, que estende a classe Email, use:
$this->load->library('email');
Uma vez carregada, você irá usar a variável classe da mesma forma que usaria para a classe que irá estender. No caso da classe
email, todas as chamadas irão usar:
$this->email->alguma_função();
Configurando seu próprio Prefixo
Para configurar seu próprio prefixo de subclasse, abra seu arquivo application/config/config.php e procure este item:
$config['subclass_prefix'] = 'MY_';
Por favor, note que todas as bibliotecas nativas do Code Igniter têm o prefixo CI_ então NÂO USE isto como seu prefixo.