Estendendo o Core do Code Igniter
Uma das razões que nos faz utilizar uma framework é poupar tempo. Porém, as vezes é preciso fazer algumas adaptações para melhorarmos ainda mais a eficiência no desenvolvimento da aplicação. É aí que a framework precisa oferecer flexibilidade.
Como já disse anteriormente, estou utilizando o Code Igniter para desenvolver um projeto pessoal, e vou mostrar o princípio de uma pequena adaptação que vai me poupar muito tempo e várias linhas de código.
A framework possui uma funcionalidade chamada Active Records, que simplifica os comandos básicos de acesso ao banco (Select, Update, Delete e Insert). Veja um exemplo de um Insert, tirado do próprio user guide:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->insert('mytable', $data);
Simples, porém, pra utilizar este método dentro de um método inserir() numa classe de modelo, eu preciso sempre especificar a tabela e seus campos em um array com seus respectivos valores.
Utilizando Modelos que representam as Tabelas do meu banco, isto é, a classe conter atributos iguais aos campos das tabelas, podemos criar uma estensão da classe Model para não ter trabalho com estes métodos, e fazer nossos modelos estenderem desta nova classe.
O código abaixo deverá ser colocado num arquivo chamado MY_Model.php dentro do diretório application\libraries, que o CI se encarrega de carregá-la pra você (1).
class MY_Model extends Model
{
var $nmTabela;
var $nmCampoId;
/**
* metodo construtor da classe
* @param [str] nome da tabela do objeto
* @param [str] nome do campo identificador do objeto
*/
function MY_Model($nmTabela, $nmCampoId)
{
$this->nmTabela = $nmTabela;
$this->nmCampoId = $nmCampoId;
parent::Model();
}
/**
* metodo de insercao no banco
* @param [arr] array com os dados do objeto para insercao do banco
* @return [boo] sucesso ou falha no processo
*/
function inserir($arrDados)
{
$atributos = get_class_vars( get_class($this) );
foreach ($atributos as $nmAtributo => $valor)
{
if ( ($nmAtributo != 'nmTabela') && ($nmAtributo != 'nmCampoId') )
$this->$nmAtributo = $arrDados[$nmAtributo];
}
return $this->db->insert('usuarios', $this);
}
}
Dessa forma, toda classe de modelo da sua aplicação terá um método inserir() onde você só precisa passar por parâmetro um array (provavelmente vindo de um formulário) com o nome dos campos da classe e seus valores. O método se encarrega de definir os valores para os atributos do objeto e chamar a função de inserção.
Como o artigo ficou um pouco grande, resolvi omitir os métodos alterar() e excluir(), mas o arquivo completo está disponível para download aqui. Este foi apenas um exemplo simples do que podemos fazer em cima de uma boa estrutura.
(1) - Apesar do que diz o manual, o Code Igniter não carrega o MY_Model automaticamente. E não adianta também usar o autoload, pois ali o Model ainda não foi carregado. Você pode criar um MY_Controller que executa a chamada do MY_Model automaticamente, usando: $this->load->model('model');. Acredito que seja um bug do CI, mas ainda vou verificar com mais calma.
If you're new here, you may want to subscribe to my RSS feed. Thanks for visiting!
Related Posts
Fatal error: Call to undefined function similar_posts() in /home/owshit/public_html/newtonwagner/wordpress/wp-content/themes/cms2/single.php on line 74