mvc php- php oop

Download MVC PHP- PHP OOP

Post on 27-Oct-2015

150 views

Category:

Documents

6 download

Embed Size (px)

TRANSCRIPT

MVC PHP- PHP OOP

Ol. Neste post pretendo demonstrar um exemplo simples e prtico de como usar o PHP orientado a objetos no esquema MVC (Model View Controller).Observao : esse esquema passa a funcionar muito bem a partir do PHP 5.3

O resultado final ser uma pgina que lista os clientes cadastrados.(nos prximos posts de PHP posso detalhar as funes CRUD)

No pretendo discutir os conceitos de MVC, apenas mostrar sua implementao em PHP, destacando a facilidade de construo e manuteno de cdigo, quando as partes (camadas) da aplicao esto separadas em :M- Modelo de Dados: estrutura dos Objetos (Classes)V-View: Interface de apresentao dos dados p/ o Usurio (Telas ou pginas)C- Controle : Regras de negcios (Componentes e Controllers)

Essas camadas devem ser independentes, ou seja : se mudar alguma regra de negcio, esta deve ser implementada na camada de Controle, assim como se a interface for alterada, no existe a a necessidade de se mexer nas regras.

Eu costumo utilizar mais uma "camada" em minhas aplicaes conhecida como DAO(Data Access Object) que a camada responsvel pela comunicao 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 organizao de cdigo : (Neste exemplo mostrarei com a seo clientes)

Figura 2- Estrutura de pastas e arquivos

--App :--Controller : cada Objeto tem o seu, onde ficam as regras de negcio

--DAO :cada Objeto tem o seu

--Model :quase todas as entidades do DB possuem o seu Objeto e outras informaes que sejam compartilhadas em vrias sees do site

View : cada Objeto tem sua pasta com as operaes bsicas de qualquer CRUD (Create Read Update Delete)e um ndice (lista inicial)C-> add.phpR-> view.phpU-> edit.phpD->remove.php

--lib : pasta que contm asprincipaisfunes compartilhadas do sistema.

pastas com itens de layout do site :--css : estilos css--images : imagens da seo pblica--img : imagens da seo privada--js : arquivos javascript--pages : as pginas do site--static_includes : arquivos que no mudam : meta-tags, cabealho, rodap

Tabelas do Banco de Dados (MYSQL nesse exemplo):Cliente,Estado,Cidade

Figura 3- Diagrama do DB

?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071-- 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 ACTIONON UPDATE NO ACTION)ENGINE = InnoDBAUTO_INCREMENT = 9715DEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ci-- clienteCREATE 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 ACTIONON UPDATE NO ACTION,CONSTRAINT `estado_cliente_FK`FOREIGN KEY (`estado_id` )REFERENCES `mydb`.`estado` (`id` )ON DELETE NO ACTIONON UPDATE NO ACTION)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8COLLATE = utf8_general_ci

Aps algumas introdues , vamos ao cdigo :De onde veio este exemplo existem clientes e funcionrios.Ambos so pessoas.Assim sendo temos a classe base Pessoa e as classes que estendem Pessoa que so Cliente e Funcionario./app/model/Pessoa.php?1234567891011121314151617181920212223242526272829// @arquivo = /app/model/Pessoa.php// MVC : model// objeto : Pessoaclass Pessoa {var $id;var $nome;//construtor para poder usar o operador new()public function Pessoa() {}public function getId() {return $this->id;}public function setId($id) {$this->id = $id;}public function getNome() {return $this->nome;}public function setNome($nome) {$this->nome = $nome;}}

/app/model/Cliente.php?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204// @arquivo = /app/model/Cliente.php// MVC : model// objeto : Clienterequire_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Pessoa.php');class Cliente extends Pessoa{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;//auxiliarvar $cidadeNome;var $estadoNome;public function Cliente() {$this->id=0;}//funcoes automagicas pode fazer assim function __set($param, $value) {$this->$param = $value;}function __get($var) {return $this->$var;}// ou fazer todos os getters e setters public function getEmail() {return $this->email;}public function setEmail($email) {$this->email = $email;}public function getDdd() {return $this->ddd;}public function setDdd($ddd) {$this->ddd = $ddd;}public function getFone() {return $this->fone;}public function setFone($fone) {$this->fone = $fone;}public function getRamal() {return $this->ramal;}public function setRamal($ramal) {$this->ramal = $ramal;}public function getEndereco() {return $this->endereco;}public function setEndereco($endereco) {$this->endereco = $endereco;}public function getEnderecoNum() {return $this->enderecoNum;}public function setEnderecoNum($enderecoNum) {$this->enderecoNum = $enderecoNum;}public function getEnderecoComplemento() {return $this->enderecoComplemento;}public function setEnderecoComplemento($enderecoComplemento) {$this->enderecoComplemento = $enderecoComplemento;}public function getBairro() {return $this->bairro;}public function setBairro($bairro) {$this->bairro = $bairro;}public function getCidadeId() {return $this->cidadeId;}public function setCidadeId($cidadeId) {$this->cidadeId = $cidadeId;}public function getEstadoId() {return $this->estadoId;}public function setEstadoId($estadoId) {$this->estadoId = $estadoId;}public function getCep() {return $this->cep;}public function setCep($cep) {$this->cep = $cep;}public function getTipoEndereco() {return $this->tipoEndereco;}public function setTipoEndereco($tipoEndereco) {$this->tipoEndereco = $tipoEndereco;}public function getTipoFone() {return $this->tipoFone;}public function setTipoFone($tipoFone) {$this->tipoFone = $tipoFone;}public function getTipoCliente() {return $this->tipoCliente;}public function setTipoCliente($tipoCliente) {$this->tipoCliente = $tipoCliente;}public function getCnpj() {return $this->cnpj;}public function setCnpj($cnpj) {$this->cnpj = $cnpj;}public function getCpf() {return $this->cpf;}public function setCpf($cpf) {$this->cpf = $cpf;}public function getInscrEstadual() {return $this->inscrEstadual;}public function setInscrEstadual($inscrEstadual) {$this->inscrEstadual = $inscrEstadual;}public function getSenha() {return $this->senha;}public function setSenha($senha) {$this->senha = $senha;}public function getCidadeNome() {return $this->cidadeNome;}public function setCidadeNome($cidadeNome) {$this->cidadeNome = $cidadeNome;}public function getEstadoNome() {return $this->estadoNome;}public function setEstadoNome($estadoNome) {$this->estadoNome = $estadoNome;}}

/app/controller/ClienteController.php?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105// @arquivo = /app/controller/ClienteController.php// MVC : controller// objeto : Clienterequire_once($_SERVER['D