Você está na página 1de 18

Autor: Ricardo Francisco Minz Jnior

Desenvolvendo aplicaes em camadas com PHP 5.


Talvez a primeira vista voc ache estranha a palavra Camada em programao, mas o que
vem a ser Camada?
Segundo o dicionrio:
Camada
1 - Qualquer matria de alguma espessura estendida sobre uma superfcie.
2 - Substncia aplicada sobre outra.
3 - Classe, categoria.
4 - Grande quantidade
Realidade na Programao:
Camada
Trazendo para nossa realidade de Programao, usar este conceito seria uma forma de
organizar o trabalho separando o sistema em partes menores (camadas), para resolver
problemas separadamente (separao de conceitos) desta forma o estruturando em
camadas.(uma sobre a outra)
Vantagens do uso de camadas:
Modularidade:
Melhor estruturao do sistema
Melhor entendimento
Coeso (Harmonia na relao dos arquivos)
Facilidades de Manuteno:
Custos de manuteno representam em mdia 75% do custo total do software,
ento se um sistema est com todas suas tarefas e funcionalidades bem
divididas por suas partes menores, este ser de faclima manuteno.

Estrutura bsica das Camadas:

Autor: Ricardo Francisco Minz Jnior


A estrutura a seguir ser usada para o exemplo que estar disponvel para download, ele equivalente a o
esquema acima, mas mostrando a estrutura de diretrios para que o leitor possa se guiar no exemplo.

Classes Bsicas:
Composta por classes simples do sistema, apenas com mtodos de acesso aos seus
atributos.

Coleo de Dados:
Esta camada responsvel por manipular diversos objetos das classes bsicas.
Normalmente possui alguma estrutura de armazenamento de objetos das classes
(Ex: Array de Objetos).
Conhecida tambm com Camada de Persistncia.

Coleo de Negcios:
Esta camada responsvel por realizar crticas de Negcio especficas a uma determinada classe
bsica da aplicao utilizando-se de uma Coleo de Dados, para lhe dar suporte a persistncia
de objetos da aplicao.
Ex: O usurio no pode ter a idade maior que a idade mxima de adeso ao plano (Regra de
plano de sade), ou No possvel inserir duas contas com o mesmo nmero (Regra do
Banco).
Disponibiliza servios especficos do Negcio envolvido
Ex: Funes especficas para aquela classe bsica usada pela classe de Negcio.
Geralmente chamada de cadastro.

Autor: Ricardo Francisco Minz Jnior

Classes Bsicas
Classes mais simples do sistema.
Vamos comear pela classe que trata do comportamento de um tipo de ator, algum que interage com o
sistema, nesse exemplo vamos criar a classe Pessoa.

Autor: Ricardo Francisco Minz Jnior


Interface
Vamos agora definir quais so as funcionalidades bsicas de Persistncia de uma Pessoa, como ela deve
ser guardada.
Essa forma de armazenamento chamada de Repositrio.
Vamos abstrair um pouco...
Pense que uma Pessoa pode ser persistido de diversas formas, mas para isso preciso saber quais
funcionalidades so necessrias para a persistncia.
Observe que esta classe apenas possui assinaturas de mtodos.

Voc deve estar se perguntando porque uma classe s com assinatura de mtodos?
Antes de responder esta pergunta vou citar um conceito usado no PHP5, que ser de extrema importncia
para se trabalhar com camadas, ele chamado de Induo de Tipos.
Com este recurso voc pode forar seu mtodo a receber um determinado tipo de dado.
Ex:
public function inserir(Pessoa $objPessoa)
{
$this->inserir($objPessoa);
}

* Vou passar um objeto do Tipo Bicho para esta funo.


inserir($objBicho)

* Causar o seguinte erro:


Fatal error: Argument 1 must be an instance of Pessoa

Autor: Ricardo Francisco Minz Jnior


O Php informa que o objeto que deve ser passado como parmetro da funo deve ser uma instncia da
classe Pessoa.
Agora que voc sabe do conceito de Induo de Tipos, podemos responder aquela pergunta.
Porque uma classe s com assinatura de mtodos?
Quando ns criamos uma Interface, ela ser implementada por outra classe que obrigatoriamente ter
que implementar todos os mtodos que esto assinados na Interface.
Automaticamente esta classe que implementa a interface ser do tipo da interface, e a partir da o
conceito de interface passa ter sentido.
Imagine que seu sistema pode sofrer mudanas e uma delas ser onde salvar os dados, neste caso podem
ser salvos em um arquivo txt ou num banco de dados, por exemplo.

Para deixar flexvel e no amarrar o sistema, podemos usar uma Interface que implementada por varias
classes, mas que apenas uma ser usada.
Vamos dar um exemplo:

Criei a interface Pessoa que assina o Mtodo Inserir:

Agora vamos criar uma classe que implementa a Interface RepositorioPessoa, digamos que eu resolvi
salvar os registros em um banco de dados.

Autor: Ricardo Francisco Minz Jnior


Mas de repente precisei salvar meus registros agora em um arquivo TXT, ento vou criar uma classe
para salvar registros em um TXT, e ela ter que implementar a interface, e obrigatoriamente precisa
implementar seus mtodos.

Ento podemos criar uma classe que usa nossa interface RepositorioPessoa da seguinte maneira:

Autor: Ricardo Francisco Minz Jnior


Como RepositorioPessoaBanco e RepositorioPessoaArquivo so do Tipo
RepositorioPessoa(Interface), se eu passar qualquer uma das duas minha Classe CadastroPessoa vai
entender que foi passado para ela uma Interface RepositorioPessoa, dessa maneira no gerando erros, e
deixando flexibilidade na hora de salvar meus registros.
Se eu quiser salvar em Arquivo s chegar na minha Fachada e trocar:
$this->RepositorioPessoa = new RepositorioPessoaBanco();
PARA
$this->RepositorioPessoa = new RepositorioPessoaArquivo();
E agora Minha classe CadastroPessoa trabalha normalmente.
$this->CadastroPessoa

= new CadastroPessoa($this->RepositorioPessoa)

Fachada
A idia da Fachada fornecer uma instncia nica para o sistema, de forma que o usurio s ter acesso
aos seus comportamentos superficiais, o prprio nome j diz, FACHADA, ento o que devemos
fazer para definir uma fachada ?
Primeiramente vamos usar um padro de projetos Design Pattern, esses padres so de formas de
implementaes para definir um comportamento padro, facilitando assim a nossa vida como
desenvolvedores, aumentando a manutenibilidade dos sistemas.
Ento a idia a seguinte: definir um atributo do tipo da classe como static private, deixar o construtor
como private para garantir que no ser possvel acessar o mesmo, criar um mtodo static que retorna
uma Fachada, e perguntar se j foi instanciada.

Autor: Ricardo Francisco Minz Jnior


Excees
No podemos nos esquecer das excees, onde possvel tratar erros e dar um curso
alternativo ao programa.
Poderamos ter criado Excees para a classe Pessoa, mas para melhor ser visualizado
na prtica resolvi criar uma nica classe de exceo dedicada exclusivamente para
erros de banco, como falha na conexo ou at mesmo erros nas strings de SQL.

Nesta classe quando levantada uma exceo ela recebe o cdigo do erro e faz uma
busca no banco de dados onde os erros esto em portugus, se o erro no estiver
cadastrado ela exibe o erro do em Ingls do MYSQL.

Autor: Ricardo Francisco Minz Jnior


Caso a conexo no seja efetuada ou o servidor desconhecido esta classe de exceo
trata o erro dizendo que no possvel conectar ou o servidor desconhecido.
A seguir os trechos de cdigo mostram o momento onde a exceo detectada e passada
para classe ExcecaoBanco fazer o tratamento.
1 Situao: Tentativa de Conexo

2 Situao: Execuo de um comando SQL

Apresentao
Esta a ltima camada que devemos nos importar, ser a forma que o usurio
visualizar seu sistema, e quando seu sistema est dividido desta forma voc poder
mudar o layout do seu sistema ou site sem muito esforo para a manuteno.
A seguir ser mostrado um diagrama de classes relacionando essas camadas e
envolvendo exemplos de cdigo citados nos exemplos anteriores.

Autor: Ricardo Francisco Minz Jnior

Autor: Ricardo Francisco Minz Jnior


Agora todas as classes para voc analisar e testar em seus exemplos:
Pessoa.php
class Pessoa
{
private
private
private
private
private

$id;
$nome;
$idade;
$sexo;
$cpf;

public function Pessoa($id, $nome, $idade, $sexo, $cpf)


{
$this->id
= $id;
$this->nome = $nome;
$this->idade = $idade;
$this->sexo = $sexo;
$this->cpf
= $cpf;
}
public function setId($id)
{
$this->id = $id;
}
public function getId()
{
return $this->id;
}
public function setNome($nome)
{
$this->nome = $nome;
}
public function getNome()
{
return $this->nome;
}
public function setIdade($idade)
{
$this->idade = $idade;
}
public function getIdade()
{
return $this->idade;
}
public function setSexo($sexo)
{
$this->sexo = $sexo;
}
public function getSexo()
{
return $this->sexo;
}
public function setCpf($cpf)
{
$this->cpf = $cpf;
}
public function getCpf()
{
return $this->cpf;
}
}

Autor: Ricardo Francisco Minz Jnior


Conexao.php
error_reporting("NONE");
require_once("../../excecoes/banco/ExcecaoBanco.php");
class Conexao
{
private $servidor
private $usuario
private $senha
private $banco

=
=
=
=

"localhost";
"root";
"";
"pessoa";

public function Conexao()


{
}
public function conectar()
{
try{
$link =
mysql_connect($this->servidor,$this->usuario,$this->senha);
if(mysql_errno() > 0)
{
throw new ExcecaoBanco(mysql_error(),mysql_errno());
}
mysql_select_db($this->banco,$link);
return $link;
}catch(ExcecaoBanco $e){
$e->BuscarErro();
}
}
public function desconectar()
{
mysql_close();
}
public function execute($SQL)
{
$ResultSet = mysql_query($SQL);
print $SQL;
try
{
switch (gettype($ResultSet))
{
case "boolean":
if(!$ResultSet)
{
throw new
ExcecaoBanco(mysql_error(),mysql_errno(),$SQL);
}
break;
case "resource":
return mysql_fetch_array($ResultSet);
break;
}
}catch(ExcecaoBanco $e){
$e->BuscarErro();
}
}
}

Autor: Ricardo Francisco Minz Jnior


ExcecaoBanco.php
class ExcecaoBanco extends Exception
{
private $SQL;
public function ExcecaoBanco($mensagem, $codigo, $SQL="")
{
parent::__construct($mensagem, $codigo);
$this->SQL = $SQL;
}
public function BuscarErro()
{
if( ($this->code != 2003) && ($this->code != 2005))
{
$SQL = "SELECT * FROM ERRO WHERE ID=".$this->code;
$ResultSet = mysql_query($SQL);
$teste = mysql_fetch_array($ResultSet);
echo "CDIGO
: [".$this->code."]<br>";
echo "DESCRIO : <font
color='red'>".$teste["erro"]."</font><br>";
echo "COMANDO
: <b>".$this->SQL."</b>";
}else{
switch ($this->code)
{
case 2003:
echo "CDIGO
: [".$this->code."]<br>";
echo "DESCRIO : <font color='red'>No foi
possvel conectar ao servidor MYSQL</font><br>";
die;
break;
case 2005:
echo "CDIGO
: [".$this->code."]<br>";
echo "DESCRIO : <font color='red'>Nome do
servidor desconhecido</font><br>";
die;
break;
}
}
}
}
RepositorioPessoa.php
interface RepositorioPessoa
{
public function inserir(Pessoa $objPessoa);
public function atualizar(Pessoa $objPessoa);
public function deletar($id);
public function pesquisar($id);
}

Autor: Ricardo Francisco Minz Jnior


RepositorioPessoaBanco.php
require_once("../../repositorio/banco/Conexao.php");
require_once("../../repositorio/pessoa/RepositorioPessoa.php");
require_once("../../repositorio/repositoriosql/pessoa/RepositorioPessoaSQL.php");
class RepositorioPessoaBanco implements RepositorioPessoa
{
private $Conexao;
private $RepositorioPessoaSQL;
public function RepositorioPessoaBanco()
{
$this->Conexao = new Conexao();
$this->Conexao->conectar();
$this->RepositorioPessoaSQL = new RepositorioPessoaSQL();
}
public function inserir(Pessoa $objPessoa)
{
$this->Conexao->execute($this->RepositorioPessoaSQL->inserir($objPessoa));
}
public function atualizar(Pessoa $objPessoa)
{
$this->Conexao->execute($this->RepositorioPessoaSQL->atualizar($objPessoa));
}
public function deletar($id)
{
$this->Conexao->execute($this->RepositorioPessoaSQL->deletar($id));
}
public function pesquisar($id)
{
return
$this->Conexao->execute($this->RepositorioPessoaSQL->pesquisar($id));
}
}

Autor: Ricardo Francisco Minz Jnior


RepositorioPessoaSQL.php
class RepositorioPessoaSQL
{
public function RepositorioPessoaSQL()
{
}
public function inserir(Pessoa $objPessoa)
{
$SQL = "INSERT INTO
PESSOA(ID,NOME,IDADE,SEXO,CPF)VALUES(".$objPessoa->getId().",'".$objPessoa->getNome(
)."',".$objPessoa->getIdade().",'".$objPessoa->getSexo()."','".$objPessoa->getCpf().
"')";
return $SQL;
}
public function atualizar(Pessoa $objPessoa)
{
$SQL = "UPDATE PESSOA SET
ID=".$objPessoa->getId().",NOME='".$objPessoa->getNome()."',IDADE=".$objPessoa->getI
dade().",SEXO='".$objPessoa->getSexo()."',CPF='".$objPessoa->getCpf()."' WHERE
ID=".$objPessoa->getId();
return $SQL;
}
public function deletar($id)
{
$SQL = "DELETE FROM PESSOA WHERE ID = ".$id;
return $SQL;
}
public function pesquisar($id)
{
$SQL = "SELECT * FROM PESSOA WHERE ID = ".$id;
return $SQL;
}
}
CadastroPessoa.php
require_once("../../repositorio/pessoa/RepositorioPessoa.php");
class CadastroPessoa
{
private $RepositorioPessoa;
public function CadastroPessoa(RepositorioPessoa $RepositorioPessoa)
{
$this->RepositorioPessoa = $RepositorioPessoa;
}
public function inserir(Pessoa $objPessoa)
{
$this->RepositorioPessoa->inserir($objPessoa);
}
public function atualizar(Pessoa $objPessoa)
{
$this->RepositorioPessoa->atualizar($objPessoa);
}
public function deletar($id)
{
$this->RepositorioPessoa->deletar($id);
}
public function pesquisar($id)
{
return $this->RepositorioPessoa->pesquisar($id);
}
}

Autor: Ricardo Francisco Minz Jnior


FachadaPessoa.php
require_once("../../basica/pessoa/Pessoa.php");
require_once("../../negocio/pessoa/CadastroPessoa.php");
require_once("../../repositorio/pessoa/RepositorioPessoaBanco.php");
class FachadaPessoa {
private $RepositorioPessoa;
private $CadastroPessoa;
private static $instancia = null;
private function InitCadastros()
{
$this->RepositorioPessoa = new RepositorioPessoaBanco();
$this->CadastroPessoa
= new
CadastroPessoa($this->RepositorioPessoa);
}
private function FachadaPessoa()
{
$this->InitCadastros();
}
public function getInstancia()
{
if (self::$instancia == null)
{
self::$instancia = new FachadaPessoa();
}
return self::$instancia;
}
public function inserir(Pessoa $objPessoa)
{
$this->CadastroPessoa->inserir($objPessoa);
}
public function atualizar(Pessoa $objPessoa)
{
$this->CadastroPessoa->atualizar($objPessoa);
}
public function deletar($id)
{
$this->CadastroPessoa->deletar($id);
}
public function pesquisar($id)
{
return $this->CadastroPessoa->pesquisar($id);
}
}

Autor: Ricardo Francisco Minz Jnior


Apresentao.php
require_once("../../basica/pessoa/Pessoa.php");
require_once("../../fachada/pessoa/FachadaPessoa.php");
$fachada
= FachadaPessoa::getInstancia();
$objPessoa = new Pessoa(1,"Ricardo Minz",23,'M',123);

//
//
//

$fachada->inserir($objPessoa);
$fachada->atualizar($objPessoa);
$fachada->deletar(1);
$objPessoa = $fachada->pesquisar(1);

Espero ter contribudo para o conhecimento comum entre os que fazem a comunidade PHP.

Ricardo Francisco Minz Jnior


Desenvolvedor WEB

Autor: Ricardo Francisco Minz Jnior

Created with an unregistered version of SCP PDF Builder


You can order SCP PDF Builder for only $19.95USD from http://www.scp-solutions.com/order.html

Você também pode gostar