PHP OO: Implementando o Padro de Projeto DAO
Desenvolver um projeto em multicamadas, no s importante, como tambm facilita a reutilizao de
cdigo e evita certos retrabalhos.
Ento, seguindo a linha da Orientao a Objetos em PHP do ltimo post, "criando getters e setters
automaticamente das classes em PHP", vou falar sobre o padro de projeto DAO (Data Access Object,
Objeto de acesso a dados), que responsvel por isolar a camada de persistncia, evitando que o
cdigo das outras camadas fique misturado com o cdigo da camada de dados.
Segue o cdigo:
?
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
include_once 'dados.cfg.php';
class DAO {
protected $con = null;
protected $host = HOST_BD;
protected $dbname = NAME_BD;
protected $user = USER_BD;
protected $password = PASSWORD_BD;
public function openConnection() {
try {
$this->con = new PDO(
'mysql:host='.$this->host.';dbname='.$this-
>dbname.';charset=utf-8',
$this->user,
$this->password
);
$this->con->exec("SET NAMES utf8");
if(!$this->con) throw new Exception("No foi possvel
contectar-se base de dados.");
return $this->con;
} catch(PDOException $e ) {
//tratar p/ arquivo de log
echo $e->getLine() ." ". $e->getMessage();
exit();
}
}
protected function closeConnection() {
if($this->con != null) $this->con = null;
}
public function __destruct() {
$this->closeConnection();
}
}
Se voc criou suas classes do domnio seguindo o padro de projeto "Mapeando Objetos como
Tabelas", para cada objeto do domnio existente, voc dever criar uma classe de implementao do
DAO que estender a classe acima a fim de se conectar ao banco de dados de sua aplicao.
Outros mtodos de consulta, insero, atualizao e excluso de registros do banco de dados devem
ser criados diretamente na classe de implementao do DAO para o referido objeto do domnio, por
exemplo, ClienteDAO. Para facilitar, crie uma interface com os mtodos mais utilizados, que poder
ficar exatamente assim:
?
1
2
3
4
5
6
7
interface IDAO {
public function findByPK($pk);
public function listAll();
public function insert($object);
public function update($object);
public function delete($pk);
}
A interface acima poder ser implementada pela classe de implementao do DAO para um
determinado objeto do domnio como a seguir:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
include_once '../domain/Cliente.class.php';
include_once 'DAO.class.php';
include_once 'IDAO.class.php';
class ClienteDAO extends DAO implements IDAO {
public function findByPK($pk) {
//cdigo
}
public function listAll() {
//cdigo
}
public function insert($object) {
//cdigo
}
public function update($object) {
//cdigo
}
public function delete($pk) {
//cdigo
}
}
No esquea de incluir os arquivos nas primeiras linhas dessa classe e implemente os mtodos
restantes. Essa forma de programar, pode ser utilizada para outras classes do domnio e outros
mtodos podem ser inseridos para consulta ao banco de dados, afinal podemos consultar um cliente
por vrias formas, no mesmo?
Para quem ficou em dvida, na classe DAO, utilizei um "SET NAMES utf8" aps abrir a conexo com o
BD. Caso voc no utilize MySQL, voc poder retirar essa linha (ou modificar o projeto para
especificar em caso de MYSQL, utilizar essa linha) que serve para retornar os caracteres especiais em
utf8, sem caracteres estranhos no cdigo.
O arquivo dados.cfg.php onde ficar as informaes do seu banco de dados, como endereo, nome
de usurio, nome do banco de dados e a senha. Mantenha esse arquivo protegido no diretrio de sua
apliacao e evite o acesso direto a ele. Se voc preferir, utilize um nome diferente, assim voc tornar
sua aplicao mais segura.
Ao fazer um include desse arquivo na classe DAO, retornamos os valores de HOST_DB, NAME_DB,
USER_DB e PASSWORD_DB, que sero utilizados para se conectar ao banco de dados especfico.
Voc poder ter vrios arquivos de configurao, para acessar mais de um banco de dados. Porm,
falaremos sobre isso em um outro momento.
Terminando nossa "aplicao", o UML dessas classes ficaro assim:
Faa o mesmo para Produto (ProdutoDAO), Fornecedor (FornecedorDAO) e todas as classes do seu
domnio.
Antigamente, os programadores faziam tudo para economizar memria em disco, pois era
escassa. Apesar de termos abundncia dessa memria hoje em dia, procure sempre trabalhar assim,
evitando reescrever algo que j est pronto em seu prprio cdigo. At um IF-THEN-ELSE pode ser
otimizado.
Cadastre seu e-mail para receber os posts do site e no esquea de curtir nossa pgina no Facebook!
Obrigado mais uma vez pela leitura. Um abrao a todos e at o prximo post!
Recommended