Canais iMasters

PHP

Construindo uma Arquitetura de Desenvolvimento em PHP 5 - Parte 03

Olá pessoas. Conversaremos hoje sobre o o Data Access Object (DAO). Como estou falando da parte negocial do sistema, veremos uma classe que terá o acesso ao banco de dados para realizar as operações de busca, inserção, etc.

Como a nossa proposta é separar em camadas a nossa aplicação, construiremos um "módulo" que fará a persistência com o banco de dados. Teremos uma classe que fará o transporte do banco e outra mais específica que executará as funções.

Cada "Entidade" (classe) que necessita fazer transações com o banco de dados terá uma classe DAO associada a ele. No caso, irei fazer a classe para a nossa entidade Cliente, que vimos no artigo passado.

A classe conterá somente métodos que realizarão funções com o objeto. Construiremos 5 métodos: incluir, recuperarTodos, recuperarPorId, alterar e excluir.

Procedimento: Na pasta "cliente" criaremos o arquivo ClienteDAO.class.php

ClienteDAO.class.php

require_once("../../../arquitetura/DAO.class.php");

class ClienteDAO extends DAO {

public function inserir(Cliente $cliente) {
$sql = "insert into cliente(nome,telefone,email,endereco)
VALUES (
'".$cliente->getNome()."',
'".$cliente->getTelefone()."',
'".$cliente->getEmail()."',
'".$cliente->getEndereco()."'
)";

$banco = $this->getBancoDados();

if(!$banco->updateSQL($sql)) {
throw new Exception("ERRO NA QUERY CLIENTEDAO MÉTODO INSERIR CLIENTE");
}
}

public function recuperarPorId($id) {
$sql = "select * from cliente where id = '".$id."'";

$banco = $this->getBancoDados();

$cliente = NULL;

$retorno = $banco->executaSQL($sql);
if($retorno != NULL) {
while($linha = mysql_fetch_array($retorno)) {
$cliente = new Cliente();
$cliente->setCodigo($linha["id"]);
$cliente->setNome($linha["nome"]);
$cliente->setEmail($linha["email"]);
$cliente->setEndereco($linha["endereco"]);
$cliente->setTelefone($linha["telefone"]);
}
return $cliente;
} else {
throw new Exception("ERRO NA QUERY CLIENTEDAO MÉTODO RECUPERAR CLIENTE POR ID");
}
}

public function recuperarTodos() {
$sql = "select id from cliente order by id desc";

$banco = $this->getBancoDados();

$retorno = $banco->executaSQL($sql);
if($retorno != NULL) {
$clientes = NULL;
$i = "0";
while($linha = mysql_fetch_array($retorno)) {
$clientes[$i] = $this->recuperarPorId($linha["id"]);
$i++;
}
return $clientes;
} else {
throw new Exception("ERRO NA QUERY CLIENTEDAO MÉTODO RECUPERAR CLIENTE TODOS");
}
}

/* Para os métodos de alterar e excluir, segue o mesmo procedimento, podendo também ser feitos métodos para realizar funções, ex.: Recuperarpordata, etc. */

}
Na pasta arquitetura crie um arquivo chamado DAO.class.php, ele será o nosso Data Access Object.
DAO.class.php
class DAO {

public $banco;

public function setBancoDados(BancodeDados $banco) {

$this->banco = $banco;

}

public function getBancoDados() {

return $this->banco;

}

}


O método inserirCliente recebe como parâmetro o objeto cliente e constrói a query com os dados do cliente. A classe estende a classe DAO (requerida da pasta arquitetura) que tem os métodos setBancoDados e getBancoDados.

Estes dois métodos são chamados quando instanciamos o ClienteDAO e passo o objeto BancodeDados já conectado (passado por referência). A classe usa esse objeto banco para realizar as operações.

Espero ter ajudado a entender o objeto DAO. No próximo artigo, veremos como funciona a SESSION FACADE (lê-se façeide), que é onde estão as regras de negócio do nosso sistema.

Script do Banco de Dados:

USE TEST;
CREATE TABLE cliente
(
id INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
telefone VARCHAR(255) NOT NULL,
endereco VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY(id)
);

Abraço!


Comente também

10 Comentários

Rogério Alves
Rogério Alves

NO CASO NÃO É FAÇEIDE E SIM "FACEIDE"

Alexandre de Castro
Alexandre de Castro

Olá Rogério, excelente artigo. Você usou Throw pra lançar a exceção, gostaria de saber se no PHP5 também é possível utilizar try/catch/finally assim com na linguagem java. Um abraço! Aguardo a sequencia do artigo.

Alexandre Köhn
Alexandre Köhn

Estou no aguardo do próximo artigo. :D
Cara, só uma coisa. Eu não sei muito de XML, você poderia passar pra mim um exemplo de um arquivo de configuração p/ conexão com o banco como o usado no seu primeiro artigo?
Meu e-mail: alexandrekohn@hotmail.com
se vc puder neh...
Valeu!
Abraço!

Rogério Alves
Rogério Alves

ALEXANDRE INFELIZMENTE O PHP SÓ TEM O TRY CATCH E NÃ O O FINALLY OK.

Wendell Diniz
Wendell Diniz

Primeiramente parabéns pelo artigo. Está muito esclarecedor, principalmente no que tange ao uso de objetos em php. Também gostaria de pedir um exemplo do arquivo xml de configuração, por favor. wendellcien[arroba]gmail[ponto]com
Valeu e continue...

Anderson  Procópio e Silva Procópio
Anderson Procópio e Silva Procópio

Rogério,
Quando teremos a continuação do artigo.
Estou ancioso...
Abraços e continui assim!!!

Apoena Machado Cunha
Apoena Machado Cunha

Rogério, achei um lance estranho! Não entendi porque usa uma classe para conectar e fazer consultas no banco, mas quando vai puxar os resultados, usa comando do PHP diretamente. Então não adianta nada usar a classe de abstração.

Veja:

$retorno = $banco->executaSQL($sql);

mas logo depois

while($linha = mysql_fetch_array($retorno))

Não deveria ser assim?

$banco->fetchArray($retorno);

Falou!

Rogério Rodrigues
Rogério Rodrigues

Apoena Machado Cunha, AGRADEÇO A SUA OBSERVAÇÃO, MAS COMO EU JÁ HAVIA DITO, VOCÊS PODEM ABUSAR DE FUNCIONALIDADES QUE ACHEM INTERESSANTES, ISSO É BOM, MAS O MEU OBJETO NESTA SÉRIE DE ARTIGOS NÃO É ENTRAR A FUNDO EM COMO VAI FUNCIONAR A PERSISTÊNCIA DE DADOS E SIM A IDÉIA DA DIVISÃO DA CAMADA, A MAIORIA DAS PESSOAS PREFEREM USAR FRAMEWORKS DE PERSISTENCIA, ENTÃO A IDÉIA É SEPARAR ISSO DE REGRAS DE NEGÓCIO E LAYOUT. A CLASSE BANCODEDADOS FOI SÓ UMA IDÉIA DE PERSISTENCIA BEM SIMPLES PARA EU NÃO ENTRAR A FUNDO NISSO OK.

Ricardo Aparecido Lopes
Ricardo Aparecido Lopes

Olá Rogério, poderia por favor me passar também o arquivo xml que envia os dados da conexão para a classe de conexão com o banco?

Ricardo Aparecido Lopes
Ricardo Aparecido Lopes

Olá Rogério, poderia por favor me passar também o arquivo xml que envia os dados da conexão para a classe de conexão com o banco?

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize