MVC PHP- PHP OOP Olá. Neste post pretendo demonstrar um exemplo simples e prático de como usar o PHP orientado a objetos no esquema MVC (Model View Controller ). Observação : esse esquema passa a funcionar muito bem a partir do PHP 5.3 O resultado final será uma página que lista os clientes cadastrados. (nos próximos posts de PHP posso detalhar as funções CRUD) Não pretendo discutir os conceitos de MVC, apenas mostrar sua implementação em PHP, destacando a facilidade de construção e manutenção de código, quando as partes (camadas) da aplicação estão separadas em : M- Modelo de Dados: estrutura dos Objetos (Classes) V-View: Interface de apresentação dos dados p/ o Usuário (Telas ou páginas) C- Controle : Regras de negócios (Componentes e Controllers) Essas camadas devem ser independentes, ou seja : se mudar alguma regra de negócio, esta deve ser implementada na camada de Controle, assim como se a interface for alterada, não existe a a necessidade de se mexer nas regras. Eu costumo utilizar mais uma "camada" em minhas aplicações conhecida como DAO (Data Access Object) que é a camada responsável pela comunicação com o Banco de Dados. Esta é utilizada pela camada de Controle para carregar os Modelos com os dados e entregar para as Views.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
MVC PHP- PHP OOP
Olá. Neste post pretendo demonstrar um exemplo simples e prático de como usar o PHP orientado a objetos no esquema MVC (Model View Controller).Observação : esse esquema passa a funcionar muito bem a partir do PHP 5.3
O resultado final será uma página que lista os clientes cadastrados.(nos próximos posts de PHP posso detalhar as funções CRUD)
Não pretendo discutir os conceitos de MVC, apenas mostrar sua implementação em PHP, destacando a facilidade de construção e manutenção de código, quando as partes (camadas) da aplicação estão separadas em :M- Modelo de Dados: estrutura dos Objetos (Classes)V-View: Interface de apresentação dos dados p/ o Usuário (Telas ou páginas)C- Controle : Regras de negócios (Componentes e Controllers)
Essas camadas devem ser independentes, ou seja : se mudar alguma regra de negócio, esta deve ser implementada na camada de Controle, assim como se a interface for alterada, não existe a a necessidade de se mexer nas regras.
Eu costumo utilizar mais uma "camada" em minhas aplicações conhecida como DAO (Data Access Object) que é a camada responsável pela comunicação com o Banco de Dados. Esta é utilizada pela camada de Controle para carregar os Modelos com os dados e entregar para as Views.
Figura 1- Resumo MVC
Exemplo de organização de código : (Neste exemplo mostrarei com a seção clientes)
--App :--Controller : cada Objeto tem o seu, é onde ficam as regras de negócio
--DAO : cada Objeto tem o seu
--Model : quase todas as entidades do DB possuem o seu Objeto e outras informações que sejam compartilhadas em várias seções do site
View : cada Objeto tem sua pasta com as operações básicas de qualquer CRUD (Create Read Update Delete) e um índice (lista inicial)C-> add.phpR-> view.phpU-> edit.phpD-> remove.php
--lib : pasta que contém as principais funções compartilhadas do sistema.
pastas com itens de layout do site :--css : estilos css--images : imagens da seção pública--img : imagens da seção privada--js : arquivos javascript--pages : as páginas do site--static_includes : arquivos que não mudam : meta-tags, cabeçalho, rodapé
Tabelas do Banco de Dados (MYSQL nesse exemplo):Cliente,Estado,Cidade
Figura 3- Diagrama do DB
?
12345678910111213141516
-- estado
CREATE TABLE IF NOT EXISTS `mydb`.`estado` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `uf` VARCHAR(2) NULL DEFAULT NULL , `nome` VARCHAR(45) NULL DEFAULT NULL , PRIMARY KEY (`id`) )ENGINE = InnoDBAUTO_INCREMENT = 28DEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ci
-- cidade
CREATE TABLE IF NOT EXISTS `mydb`.`cidade` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `estado_id` INT(11) NOT NULL , `uf` VARCHAR(2) NULL DEFAULT NULL , `nome` VARCHAR(120) NULL DEFAULT NULL , PRIMARY KEY (`id`) , INDEX `estado_cidade_FK` (`estado_id` ASC) , CONSTRAINT `estado_cidade_FK` FOREIGN KEY (`estado_id` ) REFERENCES `mydb`.`estado` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION)ENGINE = InnoDBAUTO_INCREMENT = 9715DEFAULT CHARACTER SET = utf8
CREATE TABLE IF NOT EXISTS `mydb`.`cliente` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `nome` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `email` VARCHAR(130) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `ddd` VARCHAR(3) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `fone` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `ramal` VARCHAR(6) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `endereco` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `numero` VARCHAR(7) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `complemento` VARCHAR(30) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `bairro` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `cidade_id` INT(11) NOT NULL , `estado_id` INT(11) NOT NULL , `cep` VARCHAR(9) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL , `tipo_end` ENUM('Res','Com','Cor') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL DEFAULT 'Res' , `tipo_fone` ENUM('Res','Com','Cel') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT 'Res' , `tipo_cliente` ENUM('pf','pj') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `cnpj` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `cpf` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `inscr_estadual` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL , `senha` VARCHAR(8) NULL DEFAULT NULL , `ativo` TINYINT(1) NOT NULL DEFAULT '1' , `contato` VARCHAR(150) NULL DEFAULT NULL , PRIMARY KEY (`id`) , INDEX `cidade_cliente_FK` (`cidade_id` ASC) , INDEX `estado_cliente_FK` (`estado_id` ASC) , CONSTRAINT `cidade_cliente_FK` FOREIGN KEY (`cidade_id` ) REFERENCES `mydb`.`cidade` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `estado_cliente_FK` FOREIGN KEY (`estado_id` ) REFERENCES `mydb`.`estado` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ci
Após algumas introduções , vamos ao código : De onde veio este exemplo existem clientes e funcionários.Ambos são pessoas.Assim sendo temos a classe base Pessoa e as classes que estendem Pessoa que são Cliente e Funcionario. /app/model/Pessoa.php?
var $email; var $ddd; var $fone; var $ramal; var $endereco; var $enderecoNum; var $enderecoComplemento; var $bairro; var $cidadeId; var $estadoId; var $cep; var $tipoEndereco; var $tipoFone; var $tipoCliente; var $cnpj; var $cpf; var $inscrEstadual; var $senha; //auxiliar var $cidadeNome; var $estadoNome;
class ClienteController { // nao é necessario criar um construtor function add(Cliente $cliente) { $clienteDAO = new ClienteDAO(); $clienteDAO->adicionarCliente($cliente); }
function edit(Cliente $cliente) { $clienteDAO = new ClienteDAO(); $clienteDAO->atualizarCliente($cliente); }
function remove($clienteId) { $clienteDAO = new ClienteDAO(); $clienteDAO->removerCliente($clienteId); }
function desativar($clienteId) { $clienteDAO = new ClienteDAO(); $clienteDAO->desativarCliente($clienteId); }
public function loadOptions($idPreSelecionado) { // p/ montar os combos $clienteDAO = new ClienteDAO(); $clientes = $clienteDAO->getClientes(); $conta = 0;
while ($row = mysql_fetch_array($rs)) { $cliente = new Cliente(); $cliente->setId($row['id']); $cliente->setNome($row['nome']); $arrClientes[$indice] = $cliente; $indice++; }
$conexao->desconecta(); return $arrClientes; }
public function getClientesBusca($busca) { $arrClientes = array(); $indice = 0; $sqlQuery = "Select id,nome from cliente where nome like '%" . $busca . "%' order by nome";
$conexao = new Conexao(); $conexao->conecta(); $rs = $conexao->executeQuery($sqlQuery);
while ($row = mysql_fetch_array($rs)) { $cliente = new Cliente(); $cliente->setId($row['id']); $cliente->setNome($row['nome']); $arrClientes[$indice] = $cliente; $indice++; }
public function getClientesPaginados($primeiroRegistro, $numPorPagina, $buscaCliente) { $sqlQuery = "Select CL.*,C.nome as cidade,E.nome as estadofrom cliente CL left join estado E on (CL.estado_id = E.id)left join cidade C on (CL.cidade_id=C.id ) ";
$conexao = new Conexao(); $conexao->conecta(); $sqlQuery = "SELECT COUNT(*) as total FROM mydb.cliente C "; if ($buscaCliente != NULL) { $sqlQuery.=" WHERE C.nome like '%" . $buscaCliente . "%' "; } $rs = $conexao->executeQuery($sqlQuery); $total = 0; while ($row = mysql_fetch_array($rs)) {
$conexao = new Conexao(); $conexao->conecta(); $sqlQuery = "SELECT * FROM mydb.cliente C where id=" . $id; $rs = $conexao->executeQuery($sqlQuery); $cliente = new Cliente(); if ($row = mysql_fetch_array($rs)) {