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!