CodeIgniter – Models (Parte I)

Olá leitores,

Continuando com nossa série de posts sobre o framework CodeIgniter, hoje falaremos à respeito de Models. A camada “M” do MVC. Para melhor compreender esse artigo recomendo antes a leitura dos outros posts à respeito do CI. (www.rafaelwendel.com/categoria/codeigniter).

Pois bem! Feito isso, vamos começar efetivamente a falar sobre Models (ou Modelos). Model é a camada responsável por fazer a abstração e persistência dos dados da aplicação no banco. Logo, é aqui que implementamos todos os métodos de inserção, edição, exclusão e recuperação no banco de dados.

O CodeIgniter possui diversos drivers que auxiliam o processo de conexão e comunicação com os principais SGBDs. Esses drivers tornam a nossa vida bem mais fácil, uma vez que já fornecem acesso padronizado e seguro aos dados.

Mas indo direto ao que interessa, veremos à seguir como montar toda a estrutura (Com Controller, View e Model) para inserir registros em uma tabela do banco de dados. Por conveniência utilizarei o banco de dados MySQL nesse tutorial.

Antes de mais nada, irei criar um “schema” no MySQL com nome “codeigniter“. Depois vou criar uma tabela chamada “produto” e definir os atributos idproduto(INT AUTO_INC), nome(VARCHAR(45)) e valor(FLOAT).

Criando Models

No CodeIgniter os models devem vir dentro da pasta application/models (obviamente). É interessante também que obedeçamos o padrão de nomenclatura definidos pelo framework. Portanto irei criar o arquivo com nome produto_model.php (tudo minúsculo) e definirei a classe com o nome Produto_model (Primeira letra maiúscula e o restante em minúsculo). No CI, todos os models devem extender a classe CI_Model. Veja:

1
2
3
4
5
6
7
8
9
10
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
 
}

Agora vou declarar nessa classe os atributos nome e valor que são os atributos da tabela referente à esse model no banco de dados. Depois crio um método inserir que será o responsável por gravar os dados vindo do formulário no BD.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/**
 * Description of Produto_model
 *
 * @author rafael
 */
class Produto_model extends CI_Model {
 
    public $nome;
    public $valor;
 
    public function __construct() {
        parent::__construct();
    }
 
    public function inserir(){
        return $this->db->insert('produto', $this);
    }
}

Veja que o método insert deve receber 2 parâmetros: o primeiro é o nome da tabela e o segundo é a própria instância da classe model.

Configurando os parâmetros de conexão com o banco de dados

Apesar de você poder definir os parâmetros de conexão com o banco de dados em qualquer lugar da aplicação, o mais comum é que se faça isso através do arquivo database.php que está no diretório application/config. Vamos abrir esse arquivo e definir os parâmetros de conexão (host, usuário, senha, banco, etc.).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
|	['hostname'] The hostname of your database server.
|	['username'] The username used to connect to the database
|	['password'] The password used to connect to the database
|	['database'] The name of the database you want to connect to
|	['dbdriver'] The database type. ie: mysql.  Currently supported:
				 mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
|	['dbprefix'] You can add an optional prefix, which will be added
|				 to the table name when using the  Active Record class
|	['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|	['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|	['cache_on'] TRUE/FALSE - Enables/disables query caching
|	['cachedir'] The path to the folder where cache files should be stored
|	['char_set'] The character set used in communicating with the database
|	['dbcollat'] The character collation used in communicating with the database
|	['swap_pre'] A default table prefix that should be swapped with the dbprefix
|	['autoinit'] Whether or not to automatically initialize the database.
|	['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|							- good for ensuring strict SQL while developing
|
| The $active_group variable lets you choose which connection group to
| make active.  By default there is only one group (the 'default' group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
*/
 
$active_group = 'default';
$active_record = TRUE;
 
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'rafael_dba';
$db['default']['password'] = 'some_pass';
$db['default']['database'] = 'codeigniter';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
 
 
/* End of file database.php */
/* Location: ./application/config/database.php */

Nas linhas 44, 45, 46 e 47 eu coloquei meus dados de acesso. É claro que você terá que colocar os seus 😉

Criando o Controller

Vou criar agora um controller inserir_produto.php para fazer o controle do fluxo de informações do formulário para o banco de dados. Nesse controller eu carrego o model Produto_model e verifico se o form (que implementaremos na view daqui à pouco) foi submetido. Se sim, eu recupero as informações e as defino na instância do Produto_model. Depois executo o método de inserção implementado no model.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Inserir_produto extends CI_Controller {
 
        public function __construct() {
            parent::__construct();
        }
 
 
	public function index(){
            $dados = array();
            $this->load->model('Produto_model', '', TRUE);
 
            if($this->input->post('acao') == 'inserir'){
                $this->Produto_model->nome = $this->input->post('nome');
                $this->Produto_model->valor = $this->input->post('valor');
                if($this->Produto_model->inserir()){
                    $dados['msg'] = 'Produto inserido com sucesso!';
                }
                else{
                    $dados['msg'] = 'Erro ao inserir produto.';
                }
            }
 
            $this->load->view('inserir', $dados);
	}
}
 
/* End of file inserir_produto.php */
/* Location: ./application/controllers/inserir_produto.php */

OBS 1: Para carregar um model no CI basta utilizar o método $this->load->model(‘Nome_model’). Dessa forma é criado uma instância/objeto do model com o mesmo nome (por padrão) e fica disponível para utilização assim: $this->Nome_model->funcao(); Você pode ainda carregar um model e definir o nome do objeto. É só passar o nome no segundo parâmetro: $this->load->model(‘Nome_model’, ‘nome_obj’). Utilizando o objeto: $this->nome_obj->funcao();

OBS 2: Por padrão a conexão com o banco de dados é feita somente quando solicitada. Portanto, para estabelecer a conexão devemos informar o terceiro parâmetro do médoto $this->load->model() assim: $this->load->model(‘Nome_model’, ”, TRUE). Assim a conexão é feita com base nas informações padrões (default) que colocamos lá no arquivo database.php

OBS 3: Na linha 14, o método $this->input->post() tem o mesmo efeito do famoso $_POST[]. Com a diferença de que no primeiro são aplicadas algumas regras e filtros de segurança nas informações submetidas via método post.

Criando a View

Ficou faltando apenas criar a View, que é efetivamente onde será apresentado ao usuário o formulário para que ele possa inserir um novo produto ao banco de dados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
    <head>
        <title>CodeIgniter - Models</title>
    </head>
    <body>
        <h1>Cadastro de Produtos</h1>
        <?php echo (isset($msg) ? $msg : '') ?>
        <form method="post">
            <input type="hidden" name="acao" value="inserir" />
            <p>Nome do Produto: <br /><input type="text" name="nome" /></p>
            <p>Valor: <br /><input type="text" name="valor" /></p>
            <p><input type="submit" value="Cadastrar" /></p>
        </form>
    </body>
</html>

Detalhe: criei um campo oculto (hidden) apenas para verificar no controller se o form foi submetido.

E quando for submetido e a página for novamente carregada, irá aparecer uma mensagem falando se os dados foram inseridos com sucesso ou se houve algum erro (foi implementado isso lá no if/else do controller).

E ponto final no post de hoje. No próximo vamos ver como consultar os dados no banco e exibí-los ao usuário.

Abs!

Confira todos os posts da série CodeIgniter Framework

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Olá Rafael!
    Excelente matéria. Tenho uma pergunta sobre os frameworks mais usados no mercado. Para o mercado de trabalho, qual seria a melhor opção para investir em aprendizado: Zend ou CodIgniter?
    Pois nos anúncios de vagas de emprego sempre vejo as empresas procurando quem tem experiência no Zend.
    Abs

    1. Olá Julio,

      Pelo que acompanho do mercado, as grandes empresas geralmente exigem conhecimentos em ZendFramework, pois ele consegue ser o mais robusto do mercado. Para grandes projetos onde deve-se preocupar com segurança, padrões, escalabilidade, etc, o Zend acaba se tornando a melhor opção. Agora com o Zend 2, que se não me engano, foi totalmente refatorado, as funcionalidades foram ainda mais aprimoradas e esse FW não deixa nada a desejar perante outros famosos de outras linguagens como Rails ou Django.

      Essa é minha opinião. E essa questão que você levantou é bem interessante para se discutir.

      Abs!

  2. Rafael, parabéns pela sua iniciativa, você tem uma ótima didática, e como você, eu tinha dificuldade de aprendizado com frameworks como Zend e Cake, conheci CodeIgniter através de teu blog e estou gostando muito, não deixe de publicar mais posts relacionado à este tema, por favor. Abraços

  3. (Post meio antigo, mas continua ajudando a gurizada). Valeu Rafael, estava com um problema aqui na empresa, e deu certinho passando para o CodeIgniter com teu POST. Obrigado

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *