30/01/2012

PHP OO: Implementando o Padrão de Projeto DAO

Desenvolver um projeto em multicamadas, não só é importante, como também facilita a reutilização de código e evita certos retrabalhos.

Então, seguindo a linha da Orientação a Objetos em PHP do último post, "criando getters e setters automaticamente das classes em PHP", vou falar sobre o padrão de projeto DAO (Data Access Object, Objeto de acesso a dados), que é responsável por isolar a camada de persistência, evitando que o código das outras camadas fique misturado com o código da camada de dados.



Segue o código:

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("Não foi possível 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 domínio seguindo o padrão de projeto "Mapeando Objetos como Tabelas", para cada objeto do domínio existente, você deverá criar uma classe de implementação do DAO que estenderá a classe acima a fim de se conectar ao banco de dados de sua aplicação.

Outros métodos de consulta, inserção, atualização e exclusão de registros do banco de dados devem ser criados diretamente na classe de implementação do DAO para o referido objeto do domínio, por exemplo, ClienteDAO. Para facilitar, crie uma interface com os métodos mais utilizados, que poderá ficar exatamente assim:

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 implementação do DAO para um determinado objeto do domínio como a seguir:

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) {
  //código
 }
 
    public function listAll() {
  //código
 }
 
    public function insert($object) {
  //código
 }
    public function update($object) {
  //código
 }
    public function delete($pk) {
  //código
 }
}

Não esqueça de incluir os arquivos nas primeiras linhas dessa classe e implemente os métodos restantes. Essa forma de programar, pode ser utilizada para outras classes do domínio e outros métodos podem ser inseridos para consulta ao banco de dados, afinal podemos consultar um cliente por várias formas, não é mesmo?

Para quem ficou em dúvida, na classe DAO, utilizei um "SET NAMES utf8" após abrir a conexão com o BD. Caso você não 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 código.

O arquivo dados.cfg.php é onde ficará as informações do seu banco de dados, como endereço, nome de usuário, nome do banco de dados e a senha. Mantenha esse arquivo protegido no diretório de sua apliacação e evite o acesso direto a ele. Se você preferir, utilize um nome diferente, assim você tornará sua aplicação 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 serão utilizados para se conectar ao banco de dados específico. Você poderá ter vários arquivos de configuração, para acessar mais de um banco de dados. Porém, falaremos sobre isso em um outro momento.

Terminando nossa "aplicação", o UML dessas classes ficarão assim:



Faça o mesmo para Produto (ProdutoDAO), Fornecedor (FornecedorDAO) e todas as classes do seu domínio.

Antigamente, os programadores faziam tudo para economizar memória em disco, pois era escassa. Apesar de termos abundância dessa memória hoje em dia, procure sempre trabalhar assim, evitando reescrever algo que já está pronto em seu próprio código. Até um IF-THEN-ELSE pode ser otimizado.

Cadastre seu e-mail para receber os posts do site e não esqueça de curtir nossa página no Facebook! Obrigado mais uma vez pela leitura. Um abraço a todos e até o próximo post!

Nenhum comentário: