exemplo de mvc com php e outros padrões de projeto

Upload: douglas-soares

Post on 07-Feb-2018

220 views

Category:

Documents


1 download

TRANSCRIPT

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    1/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 1/33

    Busca Busca

    DigitalDev

    Paraquem gosta de programar

    IncioLinguagens, para que servem?

    DigitalDev> Padres de Projeto> MVC> Exemplo de MVC com PHP

    Entendendo o MVC (Model-View-Controller)

    DigitalDev na Campus Party 2013

    jan 22

    Exemplo de MVC com PHPCategorias:

    MVC, Padres de Projeto

    por Tarcsio

    Nesse artigo irei demonstrar na prtica, a aplicao do padro de projeto MVC com PHP. Para isso,construirei um aplicativo de Agenda de Contatos Telefnicosconforme requisitos funcionais,diagramas e cdigo que sero mostrados ao longo desse texto. Mas, antes de comear, aconselho avocs que leiam o artigo de introduo a MVC, o mesmo poder ser visualizado acessando o linkEntendendo o MVC (Model-View-Controller).

    Hierarquia de Diretrios

    Conforme a Imagem 1, irei seguir um padro de hierarquia de diretrios e arquivos, vou explicar sobreas responsabilidades dos diretrios e arquivos logo abaixo.

    http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/2013/01/18/entendendo-o-mvc-model-view-controller/http://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/2013/02/06/digitaldev-na-campus-party-2013/http://www.digitaldev.com.br/2013/01/18/entendendo-o-mvc-model-view-controller/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/http://www.digitaldev.com.br/linguagens/http://www.digitaldev.com.br/http://www.digitaldev.com.br/https://plus.google.com/102511269987617651417/http://facebook.com/DigitalDevhttp://twitter.com/digitaldevBRhttp://www.digitaldev.com.br/feed/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    2/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 2/33

    Imagem 1 Hierarquia de Diretrios e Pastas

    Diretrio controllers

    Conforme se pode deduzir pelo nome, irei us-lo para guardar as classes da camada de controle dosistema, as famosas classescontroladorasoucontrollers, responsveis por fazer o intermdio entre acamada de dados (modelsou modelos) e visualizao (views), conforme o artigo deintroduo aMVCcitado acima.

    Diretrio databases

    Por se tratar de um projeto apenas de exemplo, irei persistir os dados dos contatose telefonesusandoum banco de dados SQLite, nesse diretrio que o arquivo referente ao banco ficar.

    Caso queria conectar a aplicao com o MySQL, veja como no fim do artigo

    Diretrio lib

    Nesse diretrio, irei guardar as classes diretamente ligadas ao sistema, como por exemplo, classes defiltros de dados, validaes genricas, helpers(caso haja algum), interfaces e abstraes no ligadas camada de negcio do sistema. Se estivesse construindo um framework em PHP, guardaria as classesdo mesmo nesse diretrio.

    Diretrio models

    Aqui, guardarei as classes de dados diretamente abstradas e ligadas s regras de negcio do sistema,como por exemplo, as classes Contatoe Telefone, entre outras.

    Diretrio views

    Esse o diretrio onde guardarei os arquivosHTMLdo sistema, tais arquivos representam a camada devisualizao (view), da qual foi falada no artigo de introduo ao MVC.

    Arquivo index.php

    um arquivo ndex como qualquer outro, nele que a execuo do sistema ir comear.

    Implementao das Classes das Camadas

    Classes Primrias ou Genricas

    Depois de todos os diretrios explicados, mostrarei a implementao de algumas classes necessriaspara a separao do sistemas em camadas (Modelo Model, Viso View , Controlador Controller). A primeira delas que mostrarei, a de controlador genrico, no diretamente ligado sregras de negcio do sistema de Agenda Telefnica. Veja o exemplo abaixo.

    http://en.wikipedia.org/wiki/SQLitehttp://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-13.51.08.png
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    3/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 3/33

    Conforme vocs devem ter visto acima, usei o sufixo Controllerno nome da classee Actionno nomedo mtodo. Esse o padro de nomenclatura que irei utilizar em todas as outras classes da camadaControle e seus mtodos. Alm disso, nomearei os arquivos que iro conter as classes com o mesmonome da prpria classe.

    A segunda classe que implementarei ser a Application. A responsabilidade da mesma ser a deverificar qual classe da camada de controle (Controller) e qual mtodo da classe (Action) o usuriodeseja executar. D uma olhada no cdigo abaixo, espero que ele seja simples o suficiente paraesclarecer seu modo de funcionamento.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    4/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 4/33

    throw new Exception("Classe '$st_class' nao existe no arquivo '$st_controller_file'");

    //verificando se o metodo existe $st_method = $this->st_action.'Action'; if(method_exists($o_class,$st_method)) $o_class->$st_method(); else throw new Exception("Metodo '$st_method' nao existe na classe $st_class'"); }

    /** * Redireciona a chamada http para outra pgina * @param string $st_uri */

    static function redirect( $st_uri ) { header("Location: $st_uri"); }}?>

    Apesar da classe acima no ter semelhana alguma com a classe IndexControllerque escrevi, elatambm faz parte da camada de controle (Controller), mas est num nvel mais acima. O fato dela serresponsvel por verificar qual controlador (Controller) e qual mtodo (Action) ir executar, faz damesma o corao do sistema.

    A terceira classe que irei implementar ser responsvel por cuidar dacamada de visualizao. Apesarde cdigo um pouco extenso, ela uma classe sem muitas funcionalidade, mas poder ser enriquecidade acordo com nossas necessidades futuras.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    5/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 5/33

    return $this->st_view; }

    /** * Define os dados que devem ser repassados view * @param Array $v_params */ public function setParams(Array $v_params) { $this->v_params = $v_params;

    }

    /** * Retorna os dados que foram ser repassados ao arquivo de visualizao

    * @return Array */ public function getParams() { return $this->v_params; }

    /** * Retorna uma string contendo todo

    * o conteudo do arquivo de visualizao *

    * @return string */ public function getContents() { ob_start(); if(isset($this->st_view)) require_once $this->st_view; $this->st_contents = ob_get_contents();

    ob_end_clean(); return $this->st_contents;

    }

    /** * Imprime o arquivo de visualizao

    */ public function showContents() { echo $this->getContents(); exit; }}?>

    Os dados de algumas classes da camada de modelodeveropersistirno banco de dados, para isso,ser necessrio a implementao de pequeno bloco de cdigo responsvel pela conexo entre o sistemae o SGDB. A alternativa que adotarei ser a de implementar uma classe abstrata, que dever ser

    herdada pelas classes em que os dados devero ser armazenados no banco de dados. Veja cdigo daclasse abstrata a seguir.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    6/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 6/33

    $st_senha ); //Fim de conexo com MySQL */

    }}?>

    Conforme Vocs j devem ter visto, a classe PersistModelAbstractfaz referncia ao arquivo db.sq3dentro do diretrio databases, esse arquivo ser o responsvel por guardar nossos dados. Irei mostrarisso na prtica com o continuar desse artigo.

    Implementarei tambm, duas outras pequenas classes, a primeira ser usada para filtrar os dados

    passados via POSTe GETe a segunda ser usada para validar os dados. Irei cham-las deDataFiltere DataValidator, respectivamente.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    7/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 7/33

    */ static function isNumeric( $mx_value ) { $mx_value = str_replace(',', '.', $mx_value); if(!(is_numeric($mx_value))) return false; return true; }

    /** * Verifica se o dado passado e um numero inteiro * @param mixed $mx_value; * @return boolean */

    static function isInteger( $mx_value ) { if(!DataValidator::isNumeric($mx_value)) return false;

    if(preg_match('/[[:punct:]&^-]/', $mx_value) > 0) return false; return true; }}?>

    Por fim, irei implementar o cdigo do arquivo index.php, o mesmo ser extremamente simples. Vejaabaixo.

    Nesse estgio de desenvolvimento, a hierarquia de diretrios e arquivos deve se dar como a Imagem 2mostrada abaixo.

    Imagem 2 Hierarquia de Diretrios e Pastas

    A Camada de Negcios

    Agora, com as classes do sistema implementadas, irei finalmente me preocupar com as regras denegcio da Agenda Telefnica. Veja a documentao abaixo.

    Lista de requisitos

    Permitir ao usurio visualizar a lista de contatos na tela principal do sistema.Permitir ao usurio administrar o cadastro de contatos.Permitir ao usurio, selecionar o contato e visualizar os telefones do mesmo.Permitir ao usurio administrar o cadastro de telefones do contato selecionado.

    Permitir ao usurio cadastrar n telefones para o contato selecionado.

    Diagrama de Casos de Uso

    http://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-14.54.45.png
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    8/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 8/33

    Imagem 3 Diagrama de Casos de Uso

    Diagrama de Classe

    Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema de Agenda Telefnica,a diagramao das classes que implementei acima no ser abordada.

    Imagem 4 Diagrama de Classes

    Diagrama de Entidade Relacionamento

    Pelo fato da necessidade da persistir os dados de contato e dos telefones, ser necessrio duas tabelaspara guardar os dados das classes. Veja o Diagrama de Entidade Relacionamento (DER) abaixo.

    Imagem 5 Diagrama de Entidade Relacionamento

    Agora que j tenho a arquitetura da camada de negcio j definida, o proximo passo implementar asclasses responsveis por gerenciar as mesmas. Isso mesmo, estou me referendo s classes Contato eTelefone, e como eu j havia falado, os dados das mesmas devem persistir no banco de dados, poresse motivo, elas devem herdar a classe PersistModelAbstract.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    9/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 9/33

    * @author DigitalDev* @version 0.1.1** Camada - Modelo ou Model.* Diretrio Pai - models* Arquivo - ContatoModel.php**/class ContatoModel extends PersistModelAbstract{ private $in_id; private $st_nome; private $st_email;

    function __construct()

    { parent::__construct(); //executa mtodo de criao da tabela de Telefone $this->createTableContato(); }

    /** * Setters e Getters da * classe ContatoModel */

    public function setId( $in_id ) { $this->in_id = $in_id; return $this; }

    public function getId()

    { return $this->in_id; }

    public function setNome( $st_nome ) { $this->st_nome = $st_nome; return $this; }

    public function getNome() { return $this->st_nome; }

    public function setEmail( $st_email ) { $this->st_email = $st_email; return $this; }

    public function getEmail() { return $this->st_email; }

    /** * Retorna um array contendo os contatos * @param string $st_nome * @return Array */ public function _list( $st_nome = null ) { if(!is_null($st_nome)) $st_query = "SELECT * FROM tbl_contato WHERE con_st_nome LIKE '%$st_nome%';"; else $st_query = 'SELECT * FROM tbl_contato;';

    $v_contatos = array(); try { $o_data = $this->o_db->query($st_query); while($o_ret = $o_data->fetchObject()) { $o_contato = new ContatoModel(); $o_contato->setId($o_ret->con_in_id); $o_contato->setNome($o_ret->con_st_nome); $o_contato->setEmail($o_ret->con_st_email); array_push($v_contatos, $o_contato); } } catch(PDOException $e) {}

    return $v_contatos; }

    /** * Retorna os dados de um contato referente * a um determinado Id * @param integer $in_id * @return ContatoModel */ public function loadById( $in_id ) {

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    10/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 10/33

    $v_contatos = array(); $st_query = "SELECT * FROM tbl_contato WHERE con_in_id = $in_id;"; $o_data = $this->o_db->query($st_query); $o_ret = $o_data->fetchObject(); $this->setId($o_ret->con_in_id); $this->setNome($o_ret->con_st_nome); $this->setEmail($o_ret->con_st_email);

    return $this; }

    /** * Salva dados contidos na instancia da classe * na tabela de contato. Se o ID for passado, * um UPDATE ser executado, caso contrrio, um

    * INSERT ser executado * @throws PDOException * @return integer */ public function save() { if(is_null($this->in_id)) $st_query = "INSERT INTO tbl_contato ( con_st_nome, con_st_email ) VALUES ( '$this->st_nome', '$this->st_email' );"; else $st_query = "UPDATE

    tbl_contato SET con_st_nome = '$this->st_nome', con_st_email = '$this->st_email' WHERE con_in_id = $this->in_id"; try {

    if($this->o_db->exec($st_query) > 0) if(is_null($this->in_id)) { /* * verificando se o driver usado sqlite e pegando o ultimo id inserido * por algum motivo, a funo nativa do PDO::lastInsertId() no funciona com sqlite */ if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') { $o_ret = $this->o_db->query('SELECT last_insert_rowid() AS con_in_id')->fetchObject(); return $o_ret->con_in_id; } else return $this->o_db->lastInsertId(); } else return $this->in_id; } catch (PDOException $e) { throw $e; } return false;

    }

    /** * Deleta os dados persistidos na tabela de * contato usando como referencia, o id da classe.

    */ public function delete() { if(!is_null($this->in_id)) { $st_query = "DELETE FROM tbl_contato WHERE con_in_id = $this->in_id"; if($this->o_db->exec($st_query) > 0) return true; } return false; }

    /** * Cria tabela para armazernar os dados de contato, caso * ela ainda no exista. * @throws PDOException */

    private function createTableContato() { /* * No caso do Sqlite, o AUTO_INCREMENT automtico na chave primaria da tabela * No caso do MySQL, o AUTO_INCREMENT deve ser especificado na criao do campo */ if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') $st_auto_increment = '';

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    11/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 11/33

    else $st_auto_increment = 'AUTO_INCREMENT';

    $st_query = "CREATE TABLE IF NOT EXISTS tbl_contato ( con_in_id INTEGER NOT NULL $st_auto_increment, con_st_nome CHAR(200), con_st_email CHAR(100), PRIMARY KEY(con_in_id) )";

    //executando a query; try {

    $this->o_db->exec($st_query); } catch(PDOException $e) { throw $e; }

    }}?>

    Agora a vez da classe TelefoneModelser implementada.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    12/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 12/33

    }

    public function getContatoId() { return $this->in_contato_id; }

    /** * Retorna um array contendo os telefones * de um determinado contato * @param integer $in_contato_id * @return Array */

    public function _list( $in_contato_id ) { $st_query = "SELECT * FROM tbl_telefone WHERE con_in_id = $in_contato_id"; $v_telefones = array(); try { $o_data = $this->o_db->query($st_query); while($o_ret = $o_data->fetchObject()) { $o_telefone = new TelefoneModel(); $o_telefone->setId($o_ret->tel_in_id); $o_telefone->setDDD($o_ret->tel_in_ddd); $o_telefone->setTelefone($o_ret->tel_in_telefone); $o_telefone->setContatoId($o_ret->con_in_id); array_push($v_telefones,$o_telefone); } } catch(PDOException $e) {}

    return $v_telefones; }

    /** * Retorna os dados de um telefone referente * a um determinado Id * @param integer $in_id * @return TelefoneModel */ public function loadById( $in_id ) { $v_contatos = array(); $st_query = "SELECT * FROM tbl_telefone WHERE tel_in_id = $in_id;"; try { $o_data = $this->o_db->query($st_query); $o_ret = $o_data->fetchObject(); $this->setId($o_ret->tel_in_id); $this->setDDD($o_ret->tel_in_ddd); $this->setTelefone($o_ret->tel_in_telefone); $this->setContatoId($o_ret->con_in_id); return $this; } catch(PDOException $e) {} return false;

    }

    /** * Salva dados contidos na instancia da classe * na tabela de telefone. Se o ID for passado, * um UPDATE ser executado, caso contrrio, um * INSERT ser executado * @throws PDOException * @return integer */ public function save()

    { if(is_null($this->in_id)) $st_query = "INSERT INTO tbl_telefone ( con_in_id, tel_in_ddd, tel_in_telefone ) VALUES ( $this->in_contato_id, '$this->in_ddd', '$this->in_telefone' );"; else $st_query = "UPDATE tbl_telefone SET tel_in_ddd = '$this->in_ddd',

    tel_in_telefone = '$this->in_telefone' WHERE tel_in_id = $this->in_id"; try {

    if($this->o_db->exec($st_query) > 0) if(is_null($this->in_id))

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    13/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 13/33

    { /* * verificando se o driver usado sqlite e pegando o ultimo id inserido * por algum motivo, a funo nativa do PDO::lastInsertId() no funciona com sqlite */ if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') { $o_ret = $this->o_db->query('SELECT last_insert_rowid() AS tel_in_id')->fetchObject(); return $o_ret->tel_in_id; } else return $this->o_db->lastInsertId(); } else

    return $this->in_id; } catch (PDOException $e) { throw $e; } return false;

    }

    /** * Deleta os dados persistidos na tabela de * telefone usando como referencia, o id da classe. */ public function delete() { if(!is_null($this->in_id)) { $st_query = "DELETE FROM tbl_telefone

    WHERE tel_in_id = $this->in_id"; if($this->o_db->exec($st_query) > 0) return true; } return false; }

    /** * Cria tabela para armazernar os dados de telefone, caso * ela ainda no exista. * @throws PDOException */ private function createTableTelefone() { /* * No caso do Sqlite, o AUTO_INCREMENT automtico na chave primaria da tabela * No caso do MySQL, o AUTO_INCREMENT deve ser especificado na criao do campo */ if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') $st_auto_increment = ''; else $st_auto_increment = 'AUTO_INCREMENT';

    $st_query = "CREATE TABLE IF NOT EXISTS tbl_telefone ( tel_in_id INTEGER NOT NULL $st_auto_increment, con_in_id INTEGER NOT NULL, tel_in_ddd CHAR(5), tel_in_telefone CHAR(12), PRIMARY KEY(tel_in_id) )";

    //executando a query; try

    { $this->o_db->exec($st_query); } catch(PDOException $e) { throw $e; }

    }}?>

    Depois das classes da camada de modelo implementadas, o prximo passo escrever o cdigo dasclasses de controle referente ao fluxo de gerenciamento das classes acima. Elas tambm sero duas,ContatoControllere TelefoneController.

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    14/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 14/33

    * Camada - Controladores ou Controllers* Diretrio Pai - controllers* Arquivo - ContatoController.php**/class ContatoController{ /** * Efetua a manipulao dos modelos necessrios * para a aprensentao da lista de contatos */ public function listarContatoAction() { $o_Contato = new ContatoModel();

    //Listando os contatos cadastrados $v_contatos = $o_Contato->_list();

    //definindo qual o arquivo HTML que ser usado para //mostrar a lista de contatos $o_view = new View('views/listarContatos.phtml');

    //Passando os dados do contato para a View $o_view->setParams(array('v_contatos' => $v_contatos));

    //Imprimindo cdigo HTML $o_view->showContents(); }

    /** * Gerencia a requisies de criao * e edio dos contatos

    */ public function manterContatoAction() { $o_contato = new ContatoModel();

    //verificando se o id do contato foi passado if( isset($_REQUEST['in_con']) ) //verificando se o id passado valido if( DataValidator::isNumeric($_REQUEST['in_con']) ) //buscando dados do contato $o_contato->loadById($_REQUEST['in_con']);

    if(count($_POST) > 0) { $o_contato->setNome(DataFilter::cleanString($_POST['st_nome'])); $o_contato->setEmail(DataFilter::cleanString($_POST['st_email']));

    //salvando dados e redirecionando para a lista de contatos if($o_contato->save() > 0) Application::redirect('?controle=Contato&acao=listarContato'); }

    $o_view = new View('views/manterContato.phtml'); $o_view->setParams(array('o_contato' => $o_contato)); $o_view->showContents(); }

    /** * Gerencia a requisies de excluso dos contatos */ public function apagarContatoAction() { if( DataValidator::isNumeric($_GET['in_con']) ) { //apagando o contato $o_contato = new ContatoModel(); $o_contato->loadById($_GET['in_con']);

    $o_contato->delete();

    //Apagando os telefones do contato $o_telefone = new TelefoneModel(); $v_telefone = $o_telefone->_list($_GET['in_con']); foreach($v_telefone AS $o_telefone) $o_telefone->delete(); Application::redirect('?controle=Contato&acao=listarContato'); }

    }}?>

    e por sua vez a classe TelefoneController

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    15/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 15/33

    ** Camada - Controladores ou Controllers* Diretrio Pai - controllers* Arquivo - TelefoneController.php*/class TelefoneController{

    /** * Efetua a manipulao dos modelos necessrios * para a aprensentao da lista de telefones do contato */ public function listarTelefonesAction() {

    if( isset($_REQUEST['in_con']) ) if( DataValidator::isNumeric($_REQUEST['in_con']) ) { $o_contato = new ContatoModel(); $o_contato->loadById($_REQUEST['in_con']);

    $o_telefone = new TelefoneModel(); $v_telefones = $o_telefone->_list($_GET['in_con']); $o_view = new View('views/listarTelefones.phtml'); $o_view->setParams(array('o_contato' => $o_contato,'v_telefones' => $v_telefones)); $o_view->showContents(); } }

    /** * Gerencia a requisies de criao * e edio dos telefones do contato

    */ public function manterTelefoneAction()

    { $o_contato = new ContatoModel(); $o_telefone = new TelefoneModel();

    if( isset($_REQUEST['in_con']) ) if( DataValidator::isInteger($_REQUEST['in_con']) ) $o_contato->loadById($_REQUEST['in_con']);

    if( isset($_REQUEST['in_tel']) ) if( DataValidator::isInteger($_REQUEST['in_tel']) ) $o_telefone->loadById($_REQUEST['in_tel']);

    if(count($_POST) > 0) { $o_telefone->setDDD(DataFilter::numeric($_POST['in_ddd'])); $o_telefone->setTelefone(DataFilter::numeric($_POST['in_telefone'])); $o_telefone->setContatoId($o_contato->getId()); if($o_telefone->save() > 0) Application::redirect('?controle=Telefone&acao=listarTelefones&in_con='.$o_contato->getId()); }

    $o_view = new View('views/manterTelefone.phtml'); $o_view->setParams(array('o_contato' => $o_contato,'o_telefone' => $o_telefone)); $o_view->showContents(); }

    /** * Gerencia a requisies de excluso de telefones do contato */ public function apagarTelefoneAction() { if( isset($_GET['in_tel']) ) if( DataValidator::isInteger($_GET['in_tel'])) { $o_telefone = new TelefoneModel(); $o_telefone->loadById($_GET['in_tel']); $o_telefone->delete();

    Application::redirect('?controle=Telefone&acao=listarTelefones&in_con='.$_GET['in_con']); }

    }}?>

    Arquivos de visualizao ou views

    As classes implementadas acima esto fazendo referncia arquivos HTML contidos na camada devisualizao, para esse programa funcionar, ser preciso implement-los. Isso o que irei fazer agora.

    Arquivo listarContatos.phtmlDiretrio Pai views

    Agenda Telefnica - Exemplo de MVC com PHP

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    16/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 16/33

    ID Nome E-mail

    Aes


    Novo Contato

    Arquivo listarTelefones.phtmlDiretrio Pai views

    Agenda Telenica - Exemplo de MVC com PHP Contato ID Nome E-mail

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    17/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 17/33


    Telefones ID

    DDD Telefone Aes

    &in_tel=
    Voltar Agenda Telefnica - Exemplo de MVC com PHP Nome E-mail Aes

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    18/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 18/33

    Agenda Telefnica - Exemplo de MVC com PHP Contato ID Nome E-mail


    Telefones DDD Telefone Aes

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    19/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 19/33


  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    20/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 20/33

    $st_dsn = "mysql:host=$st_host;dbname=$st_banco";$this->o_db = new PDO

    ( $st_dsn, $st_usuario, $st_senha ); //Fim de conexo com MySQL }}?>

    Mais sobre MVC com PHPH um tempo atrs, encontrei um material em vdeo muito bom sobre como montar um Mini-Frameworkno padro MVC com PHP. Para acessar esse videos, clique em Criando um Mini Framework PHP 5com MVC

    Mais sobre Padres de Projeto

    O MVC um dos Padres de Projetos mais importantes hoje em dia, mas no est sozinho. Existemvrios outros padres por ai, eles nos ajudam a organizar o cdigo, resolver problemas que costumamosenfrentar no dia-dia da Programao Orientada a Objeto. Sendo assim, vale muito a pena estudar sobreeles, pois um bom programador no aquele que apenas codifica solues excepcionais, mas tambm oque consegue organizar com clareza seu cdigo. Veja uma lista de alguns padres organizados por suascategorias abaixo, j um pontap inicial para se estudar. Espero ter ajudado.

    Padres de criao

    Abstract Factory, Builder, Factory Method, Prototype, Singleton

    Padres estruturais

    Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy

    Padres comportamentais

    Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy,Template Method, Visitor

    Tags: Abstract Factory, Adapter, Bridge, Builder, Chain of Responsibility, Command, Composite,Decorator, design patterns, Exemplos, Facade, Factory Method, Flyweight, Interpreter, Iterator,Mediator, Memento, MVC, Observer, Padres de Projeto, Prototype, Proxy, Singleton, State,Strategy, Template Method, Visitor

    Sobre o autor

    Tarcsio

    Bacharel em Engenharia da Computao, programador C / C++ , especialista em PHP, MySQL,PostgreSQL.

    59 comentrios

    1 meno

    Talvez voc tambm goste de ler sobre

    Classe,

    encapsulamento,

    herana, composio

    e agregao

    Entendendo o MV C

    (Model-View-

    Controller)

    Intercalando cores

    entre linhas de uma

    tabela ou lista

    usando CSS3

    c e b o o k 5 3 i t t e r 7 o g l e t e r e s t

    http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/http://www.digitaldev.com.br/2013/01/18/entendendo-o-mvc-model-view-controller/http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/http://www.digitaldev.com.br/tag/visitor/http://www.digitaldev.com.br/tag/template-method/http://www.digitaldev.com.br/tag/strategy/http://www.digitaldev.com.br/tag/state/http://www.digitaldev.com.br/tag/singleton/http://www.digitaldev.com.br/tag/proxy/http://www.digitaldev.com.br/tag/prototype/http://www.digitaldev.com.br/tag/padroes-de-projeto/http://www.digitaldev.com.br/tag/observer/http://www.digitaldev.com.br/tag/mvc/http://www.digitaldev.com.br/tag/memento/http://www.digitaldev.com.br/tag/mediator/http://www.digitaldev.com.br/tag/iterator/http://www.digitaldev.com.br/tag/interpreter/http://www.digitaldev.com.br/tag/flyweight/http://www.digitaldev.com.br/tag/factory-method/http://www.digitaldev.com.br/tag/facade/http://www.digitaldev.com.br/tag/exemplos/http://www.digitaldev.com.br/tag/design-patterns/http://www.digitaldev.com.br/tag/decorator/http://www.digitaldev.com.br/tag/composite/http://www.digitaldev.com.br/tag/command/http://www.digitaldev.com.br/tag/chain-of-responsibility/http://www.digitaldev.com.br/tag/builder/http://www.digitaldev.com.br/tag/bridge/http://www.digitaldev.com.br/tag/adapter/http://www.digitaldev.com.br/tag/abstract-factory/http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?share=pinterest&nb=1http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?share=google-plus-1&nb=1http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?share=twitter&nb=1http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?share=facebook&nb=1
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    21/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 21/33

    Pular para o formulrio de comentrio

    1.

    Isaac Sampaio

    25 de janeiro de 2013 em 0:45 (UTC -3)

    Responder

    Parabns amigo!! Muito bom

    artigo!! nota 1000.

    2.

    Jorge Sampaio

    4 de fevereiro de 2013 em 12:58 (UTC -3)

    Responder

    Cara!!!! Muito bom mesmo sua abordagem. Estou criando um aplicativo, porm, o cdigo j estmuito bagunado e de difcil assimilao, estou comeando a perder o controle do mesmo.Observando a forma com que vc lidou com seu exemplo, hummmm, fique mais entusiasmado emrefazer o meu apoiado em sua tima explicao. Fico alegre por vc compartilhar seu

    conhecimento a favor de outros. Novamente, muito obrigado e at.

    1.

    Tarcsio

    4 de fevereiro de 2013 em 13:31 (UTC -3)

    Responder

    Obrigado Jorge. Se tiver alguma dvida, entre em contato que eu tentarei ajudar.

    2.

    Eduardo

    2 de dezembro de 2013 em 9:38 (UTC -3)

    Responder

    Fao das palavras do Jorge Sampaio as minhas. Obrigado por compartilhar tal informaoque, muitos dos que esto comeando OOP tem muita dificuldade.

    3.

    Jack Makiya ma

    10 de maro de 2013 em 21:18 (UTC -3)

    Responder

    Ol Tarcsio obrigado pelo belo material publicado, parabns, foi muito esclarecedor edidtico.

    Nunca trabalhei com phpoo(tirando os web services) nem mvc, mas tenho uma noo. Masmesmo depois de ler sua publicao e varias outras que j li, no consigo visualizar eutrabalhando com mvc. Talvez por falta de conhecimento, ou falta daquele estalo que da na nossamente pra cair a fixa. Mesmo conseguindo compreender o que foi proposto. =/.

    Estou nessa busca de conseguir entender o suficiente pra mudar minha rotina de trabalho sem quecaia a produo. Mas talvez, s usando mesmo pra sacar a ideia.

    Teria algo referente a isso pra me dizer/recomendar?

    Mais uma vez, parabns pelo material e obrigado por compartilhar.o/

    4.

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=733#respondhttp://www.facebook.com/j4ck3ds0nhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=903#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=706#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=705#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=701#respond
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    22/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 22/33

    cassioroxssio

    4 de abril de 2013 em 12:45 (UTC -3)

    Responder

    Parabns, empaquei no meu projeto, acredito que o estudo desse cdigo ir me auxiliar!

    5.

    cassiorox

    4 de abril de 2013 em 12:51 (UTC -3)

    Responder

    Como tenho MySql e no SQLlite, no consegui rodar aqui :SVou tentar colocar no MySQL

    1.

    Tarcsio

    18 de julho de 2013 em 15:02 (UTC -3)

    Responder

    Boa tarde Cassio, eu revisei o cdigo e alterei o mesmo para possibilitar tanto a conexocom MySQL, quanto com SQLite. Se houver mais alguma dvida, entre em contato.

    6.

    Amarildo Lucas

    7 de abril de 2013 em 13:13 (UTC -3)

    Responder

    Ol Tarcsio,Tentei refazer o seu exemplo igualzinho mas usando mysql, no me ocorre erro algum, mas aocorrer o projecto (http://localhost:8888/mvcExemplo/?controle=Usuario&acao=listarUsuario) obrowser fica todo em branco, como se no ocorresse nada. Ainda acredito que o erro est naforma como lidei para tratar os dados com mysql. Pode me ajudar com esta dvida? Comoestaria a minha classe PersistModelAbstract.php usando mysql?

    1.

    Amarildo Lucas

    11 de abril de 2013 em 8:56 (UTC -3)

    Responder

    Ok! J consegui resolver. Obrigado!

    1.

    leandrofb

    15 de abril de 2013 em 21:44 (UTC -3)

    Responder

    Fala Amarildo to tentando usar o MySQL tb e aparece o mxm erro como vccorrigiu ? vlw

    1.

    leandrofb

    15 de abril de 2013 em 21:56 (UTC -3)

    Responder

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=750#respondhttp://gravatar.com/leandrofbhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=749#respondhttp://gravatar.com/leandrofbhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=746#respondhttp://gravatar.com/rasinchttp://localhost:8888/mvcExemplo/?controle=Usuario&acao=listarUsuariohttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=745#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=821#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=743#respondhttp://gravatar.com/cassioroxhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=742#respondhttp://gravatar.com/cassiorox
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    23/33

  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    24/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 24/33

    1.

    Tarcsio

    16 de abril de 2013 em 17:48 (UTC -3)

    Responder

    No ta mostrando mensagem de erro alguma leandro? Voc consegue fazer selects ou tquebrando tudo?

    2.

    Tarcsio

    18 de julho de 2013 em 15:07 (UTC -3)

    Responder

    Boa tarde Leandro.Revisei e alterei o cdigo, agora ele se conecta tanto com MySQL quanto com SQLite.Se houver mais alguma dvida, entre em contato

    9.

    Leonardo

    29 de abril de 2013 em 21:25 (UTC -3)

    Responder

    Cara. Show de bola a sua explicao. A melhor e mais clara que achei na net. Parabns.

    10.

    Victhor

    9 de maio de 2013 em 17:30 (UTC -3)

    Responder

    Parabens , otimo post, conseg converte para outro banco de dados de uma forma extremamentesimples, show de boa

    11.

    leandrofb

    16 de maio de 2013 em 22:48 (UTC -3)

    Responder

    Para mim aparece o seguinte erro qd eu aponto para o mysql:

    Erro no servidorO site encontrou um erro ao recuperar http://www.polesystem.com.br/mvc/?controle=Telefone&acao=manterTelefone&in_con=0. Ele pode estar em manuteno ouconfigurado incorretamente.Veja algumas sugestes:Recarregue esta pgina da web mais tarde.Erro HTTP {500 (Internal Server Error): Ocorreu uma condio inesperada enquanto o servidortentava completar a solicitao.

    Pode acessar a o link para ver tb:http://www.polesystem.com.br/mvc

    o que eu mudei do arquivos foi somente a function no arquivo PersistModelAbstract.php para :

    function __construct(){

    $mysql = host;$username = user;$passwd = senha;$sqlite = sqlite:./databases/db.sq3;

    http://www.polesystem.com.br/mvchttp://www.polesystem.com.br/mvc/?controle=Telefone&acao=manterTelefone&in_con=0http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=774#respondhttp://gravatar.com/leandrofbhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=772#respondhttp://www.excelent.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=766#respondhttp://gravatar.com/leogrillo185http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=824#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=756#respondhttp://digitaldev.com.br/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    25/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 25/33

    try{

    //Conectando ao banco de dados

    //$this->o_db = new PDO($sqlite);//$this->o_db->setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );

    $this->o_db = new PDO($mysql, $username, $passwd) or print (mysql_error());$this->o_db->setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );

    } catch (PDOException $e) {echo $e->getMessage();

    }}

    e mudei tb no arquivo Application.php a function loadRoute() onde estava index para Index pq no abria a pagina principal.

    12.

    Edson

    17 de maio de 2013 em 15:17 (UTC -3)

    Responder

    Ola, bom artigo,muito esclarecedor. Sou novado em OO e baixei os arquivos e na hora deexecutar, quando rodo a pagina index.php estou com o seguinte erro:Uncaught exception Exception with message Arquivo controllers/indexController.php naoencontrado in /home/u810533697/public_html/mvc/lib/Application.php:75 Stack trace: #0/home/u810533697/public_html/mvc/index.php(7): Application->dispatch() #1 {main} thrown in/home/u810533697/public_html/mvc/lib/Application.php on line 75Algum aqui teve esse problema?Grato

    1.

    Tarcsio

    18 de julho de 2013 em 15:10 (UTC -3)

    Responder

    Edson, o cdigo foi revisado e o bug foi corrigido. Alem disso, adicionei algumasalteraes que permitem conectar a aplicao tanto com MySQL quanto com SQLite. Seachar mais alguma coisa errada ai, entre em contato. Obrigado

    13.

    zegildo

    1 de junho de 2013 em 19:41 (UTC -3)

    Responder

    Oi, parabns pelo artigo! Apena uma dvida *Model no deveria chamar *DB e a calsseDataBase realizar as operaes no banco? Ento no *Model eu poderia ter o conceito detransao interessante para algumas aplicaes. O que voc acha?

    1.

    Tarcsio

    3 de junho de 2013 em 9:42 (UTC -3)

    Responder

    Bom dia Zegildo.

    Tentei usar classes mais simples para demonstrar o funcionamento, evitando assim a divisoda Camada Model em mais Subcamadas. Mas, conforme a experincia do programador, vlido a diviso da camada de Model em vrias outras. Eu geralmente costumo criarclasses com sufixo DAO(Data Access Object), onde as mesmas so responsveis pelapersistncia dos dados das classes com sufixo Entity(Entidades como contato, telefone,endereo).

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=778#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=777#respondhttp://about.me/zegildohttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=826#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=776#respond
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    26/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 26/33

    14.

    Srgio Novelli

    7 de junho de 2013 em 14:33 (UTC -3)

    Responder

    Tarcsio, primeiramente, parabns pelo cdigo.

    Estou tentando rodar esse cdigo, mas estou tendo o seguinte erro:

    Fatal error: Class PersistModelAbstract not found inD:\wamp\www\maisumteste\models\TelefoneModel.php on line 15

    O fato que no consegue encontrar a classe PersistModelAbstract, porm ela existe. A nicaalterao realizada foi fazer a conexo com mysql:

    abstract class PersistModelAbstract {

    protected $o_db;

    function __construct() {

    try{$this->o_db = new PDO(mysql:host=localhost;dbname=testemvc, root, ,array(PDO::ATTR_PERSISTENT => true)) or print (mysql_error());$this->o_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );}catch (PDOException $e) {echo $e->getMessage();}}

    }

    Poderia me dar uma dica do que est acontecendo? O uso da classe PDO est correto?

    Obrigado.

    1.

    Tarcsio

    18 de junho de 2013 em 13:40 (UTC -3)

    Responder

    Vou testar o cdigo com o mysql e te dou retorno.

    2.

    Tarcsio

    18 de julho de 2013 em 15:04 (UTC -3)

    ResponderSergio, eu retestei e revisei o cdigo para corrigir alguns pequenos erros. Esse errorelatado por voc foi corrigido. Obrigado.

    15.

    Roberto

    18 de junho de 2013 em 0:03 (UTC -3)

    Responder

    Boa noite Tarcsio, fico no aguardo do cdigo repetido. (TelefoneController) Tentei fazer masno consegui muito sucesso. Abraos e valeu pelo grande post!

    1.

    Tarcsio

    http://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=791#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=822#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=795#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=783#respond
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    27/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 27/33

    18 de julho de 2013 em 15:09 (UTC -3)

    Responder

    Roberto, revisei o cdigo e alterei o post. Agora a classe est no seu devido lugar.Se achar mais alguma inconsistncia, entre em contato.

    16.

    Francis Rodrigues

    18 de junho de 2013 em 10:26 (UTC -3)

    Responder

    Gostei muito da estrutura MVC que voc desenvolveu.Tem algo em mente pra colocar .htaccess nisso pra deixar com query string e url amigveltambm?

    Esse mtodo de jogar instrues SQL tambm no gostei, mas no sei uma forma de usar metaqueries como o CakePHP faz. Alguma idia?

    1.

    Tarcsio

    18 de junho de 2013 em 13:35 (UTC -3)

    Responder

    Esse cdigo um exemplo focado em MVCapenas para que programadores iniciantesentendam como funciona a estrutura. No um projeto de um framework ou algo do tipo.O SQL no meio do Model apenas para diminuir o nmero de classes e divises dacamada de Modelo, mantendo assim, o foco no entendimento do MVC. Por esse motivo,no implementei url amigvel.

    1.

    Francis Rodrigues

    28 de junho de 2013 em 23:44 (UTC -3)

    Responder

    Tarcsio programadores iniciantes?Essa foi boa hahaha.

    Sua estrutura est at melhor que a de muitos frameworks de ponta que diversascomunidades os usam.

    Precisamos criar um parse no html como templates, para evitar usar tanto php juntocom o html, criar rotas de url e deixando as urls amigvels ou no, como owordpress e joomla tem, acesso a url com query string ou com modo rewrite tudoativo.

    Estou interessado em continuar essa estrutura em projeto, quem sabe no criamosuma estrutura em que muitos podero seguir.

    Se estiver interessado, entre em contato.Abrao.

    1.

    Tarcsio

    30 de junho de 2013 em 12:46 (UTC -3)

    Responder

    Quando digo Iniciantes, quero dizer que tentei deixar a explicao mais clarapossvel, sem ir muito alem nas estruturas. Porque se eu deixasse o modelocompleto, do jeito que eu trabalho, ficaria mais difcil pro pessoal entender.

    1.

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=801#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=800#respondhttp://tosystems.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=793#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=792#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=825#respond
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    28/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 28/33

    Francis Rodrigues

    1 de julho de 2013 em 9:51 (UTC -3)

    Entendi.Mas podemos subir isso num repositrio como projeto.Considerando depois como uma arquitetura MVC open de sua autoria.

    2.

    Granhani

    29 de outubro de 2013 em 4:36 (UTC -3)

    Responder

    Tarcsio show de bola seu post!! parabns mesmo!!!a questo foi que tive a mesma ideia do Francis Rodriguese dei uma fuada no seu cdigo!!!

    adicionei o .htaccess pra gerenciar as url amigvel, e algumas outras mudanas pra issofuncionar!!!

    se o Francis Rodrigues ainda nao fez essas mudanassegue o link para download

    https://copy.com/OBL46UmwxyIC

    17.

    Ernando A. Mendes

    30 de junho de 2013 em 13:11 (UTC -3)

    Responder

    Fala Tarcsio, tudo bem? Muito bom esse material, tudo bem comentado, timo para mim quesou iniciante em MVC.

    18.

    Francis Rodrigues

    1 de julho de 2013 em 9:48 (UTC -3)

    Responder

    Tem um erro aqui:

    Fatal error: Class PersistModelAbstract not found in/home/ubuntu/projeto/models/TelefoneModel.php on line 16

    1.

    Tarcsio

    1 de julho de 2013 em 10:32 (UTC -3)

    Responder

    Vou verificar

    1.

    Francis Rodrigues

    1 de julho de 2013 em 20:58 (UTC -3)

    Responder

    que faltou incluir require_once(lib/PersistModelAbstract.php);

    e View.php tambm.

    Vai dar um monte de erro seguindo o exemplo.

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=808#respondhttp://tosystems.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=807#respondhttp://digitaldev.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=805#respondhttp://tosystems.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=804#respondhttps://copy.com/OBL46UmwxyIChttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=873#respondhttp://tosystems.net/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    29/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 29/33

    Vou ver se no cdigo do download est tudo normal.

    2.

    Tarcsio

    18 de julho de 2013 em 15:16 (UTC -3)

    Responder

    Francis, o post foi corrigido

    Foi adicionado uma funo __autoload no arquivo Application.php, com ela todas asclasses da pasta lib sero automaticamente carregadas, inclusive essa em questo.

    Obrigado pela observao.

    19.

    Cristiano Moura

    18 de julho de 2013 em 7:29 (UTC -3)

    Responder

    Parabns pelo artigo, est perfeito!

    20.

    Fabiana Moura

    2 de outubro de 2013 em 2:04 (UTC -3)

    Responder

    Curti muito sua explicao!

    21.

    Riguel

    27 de outubro de 2013 em 21:48 (UTC -3)

    Responder

    Tarcisio

    Cara sou iniciante e estou com uma duvida pois estou utilizando o seu projeto para estudocontudo no estou conseguindo passar os valores dos campos e resgatalos no lado do server dum erro dizendo que no existe, estou utilizando $POST['xxx'] teria como me dar uma fora oume explicar como realmente funciona o set e get params?? obrigado e realmente muito bom oprojeto

    22.

    Augusto

    28 de outubro de 2013 em 14:28 (UTC -3)

    Responder

    Gostei muito do artigo!!! gostaria de saber como implementar autenticao usando esse modelomvc?

    23.

    Dominus Farib

    31 de outubro de 2013 em 0:00 (UTC -3)

    Responder

    Muito bom mesmo, parabns!So de posts assim que muitos programadores PHP estruturais no Brasil precisam para

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=876#respondhttps://plus.google.com/101594159258578319451http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=872#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=871#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=866#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=818#respondhttp://www.vbsolutions.com.br/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=828#respondhttp://digitaldev.com.br/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    30/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 30/33

    crescer nos padres de projetos atuais. Muitos tm medo, mas com este post vemos que no bicho de sete cabeasDidaticamente seu post est timo, se algum criticar ou disser que esta faltando ajustes porqueest em outro nvel de conhecimentoEste link vai para meu blog

    24.

    Carlos Anders

    6 de novembro de 2013 em 22:37 (UTC -3)Responder

    Muito bom o tutorial, o padro de projeto GRASP MVC est bem definido no php, facilita muitoa vida programar orientado a objetos, principalmente web, muitos programadores realmenteprecisam aprender com solues simples e prticas, parabens.

    25.

    r23k

    24 de novembro de 2013 em 20:43 (UTC -3)

    Responder

    muito bom o seu artigo.

    26.

    Helede

    12 de dezembro de 2013 em 15:51 (UTC -3)

    Responder

    Muito bom mesmo cara, parabns. Vou iniciar um novo projeto e vou basear em MVC. Acheisua explicao muito boa.

    27.

    adrmasterCarlos Adriano

    17 de dezembro de 2013 em 9:39 (UTC -3)

    Responder

    Opa, muito bom, isso quase um framework a parte. Estou usando num projeto. E se eu quiserpassar parmetro para uma view redirecionada por exemplo: header(Location: ?controle=Contato&acao=listarContato); Se eu precisar passar parametros para o listarContato,como procedo?

    28.

    batistafic

    19 de janeiro de 2014 em 13:20 (UTC -3)

    Responder

    Muito obrigado por compartilhar seu conhecimento. O tutorial um dos melhores e maisdidticos que eu j li.

    29.

    RafaelFerreira

    24 de janeiro de 2014 em 15:46 (UTC -3)

    Responder

    Ol e em que camada coloco as excees personalizadas que criar?

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=919#respondhttp://rafaelferreira.netii.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=917#respondhttp://gravatar.com/batistafichttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=909#respondhttp://gravatar.com/adrmasterhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=908#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=892#respondhttp://deep/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=881#respondhttp://www.andershost.com.br/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    31/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 31/33

    1.

    Tarcsio

    24 de janeiro de 2014 em 16:12 (UTC -3)

    Responder

    Boa tarde Rafael.

    As excees personalizadas podem ficar em qualquer camada. Por exemplo, se voc

    quiser lanar uma exceo por um erro de banco de dados, provavelmente isso ficar nacamada de modelo, j se voc quiser lanar uma exceo porque o cara chamou umcomando / mtodo que no existe, essa ficaria na camada de controle. O que voc tem quefazer tratar as excees camada a camada, ou seja, se voc chamar a camada de modelodentro da camada de controle e a mesma lanar uma exceo personalizada, o certo tratar com try{}catch( Exception ){} para ignorar a mesma ou at mesmo mostrar umamensagem de erro ao usurio.

    1.

    RafaelFerreira

    24 de janeiro de 2014 em 17:02 (UTC -3)

    Responder

    Obrigado pela ateno, outra questo, eu coloco os arquivos/classes de exceo napasta da camada ou dentro da camada eu coloco uma pasta de exception prpria

    tipomodels/exception/ClasseException.phpoumodels/ClasseExceptions.php

    Qual o mais correto?

    30.

    Danilo

    24 de fevereiro de 2014 em 18:19 (UTC -3)

    Responder

    Ol Tarcsio, tudo bom???

    Seguinte, comecei a pouco numa nova empresa e o pessoal daqui criou nosso sistemainteiramente baseado neste seu exemplo Porem, ningum da equipe tinha muita experinciacom o modelo MVC Ento alguns problemas surgiram

    O maior deles para mim agora esta no layout Todos os demais membros da equipeimplementaram seus HTML/CSS em cada uma das views de suas telas Porem isso insano!!!Quando precisarmos, e vamos precisar, dar manuteno no layout teremos um ENORMEproblema!!!

    Eu ainda sou novo no MVC tbm Mas j trabalhei em outra empresa com um j montado.

    Enfim, minha dvida quanto a criao de uma view master com o layout padro do site. Paraque as demais views tenham APENAS o contedo interno de cada aplicao.

    Ser q vc poderia me dar uma luz em como procedo nisto?? Nem que seja me indicar algumoutro site com alguma luz sobre o assunto!

    Desde j agradeo pela fora! Seu MVC foi fundamental para ns aqui!

    Grande abraoDanilo

    1.

    RafaelFerreira

    25 de fevereiro de 2014 em 10:32 (UTC -3)

    Responder

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=928#respondhttp://rafaelferreira.netii.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=927#respondhttp://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=921#respondhttp://rafaelferreira.netii.net/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=920#respondhttp://digitaldev.com.br/
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    32/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/ 32/33

    Olha muito simples divida sua view em trs arquivos config.php (define constantes com aspastas usadas), header.php( cabealho), footer.php(rodap) ento na view independentes chame o contedo da view incluindo sempre o config, header, o contedo da view atuale footer se necessrios.. estou fazendo assim

    1.

    Danilo

    26 de fevereiro de 2014 em 17:45 (UTC -3)

    Responder

    Hmmm,Eu j estou fazendo assim nas minhas aplicaes e alguns outros membros tbmfizeram isso. Entretanto eles ainda fizeram arquivos (topo, rodape, etc) proprios.Mas com a mesma cara

    Mas isso no o ideal. Eu queria mesmo era criar um template master e aplicar asviews dentro dele Invertendo essa logica. Ou seja, ao inves deu colocar o includedos arquivos em cada view, eu incluiria cada view num template.

    Mas enfim, eu ja convenci o pessoal a migrar para um framework MCV maiscompleto. Pois creio que teremos mais desafios la pra frente

    Abs

    1. Entendendo o MVC (Model-View-Controll er) | Digita lDev

    23 de janeiro de 2013 em 8:29 (UTC -3) Link para este comentrio

    Responder

    [...] Exemplo de MVC com PHP [...]

    Deixe uma dvida, resposta ou sugesto

    Escreva o seu comentrio aqui...

    CategoriasProgramaoPHPC / C++JavaScript / AjaxBanco de DadosMySQLPostgreSQLFrameworksHTML / XHTMLCSSAndroid SDKMVCJavaScript / Ajax

    Web ServersLinux

    Mais populares da semana

    Usando mesmo HD externo no Mac OSX, Windows e Ubuntu

    396views

    Exemplo de MVC com PHP 344views

    Comunicando-se com o Facebookusando PHP

    207views

    Instalando e Configurando oAmbiente de Programao C /C++

    70 views

    Android: Usando a internet doseu computador com USB

    68 views

    http://www.digitaldev.com.br/2013/02/22/android-usando-a-internet-do-seu-computador-com-usb/#commentshttp://www.digitaldev.com.br/2013/02/22/android-usando-a-internet-do-seu-computador-com-usb/http://www.digitaldev.com.br/2011/06/30/instalando-e-configurando-o-ambiente-de-programacao-c-c/#commentshttp://www.digitaldev.com.br/2011/06/30/instalando-e-configurando-o-ambiente-de-programacao-c-c/http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/#commentshttp://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/http://www.digitaldev.com.br/2013/03/06/usando-mesmo-hd-externo-no-mac-os-x-windows-e-ubuntu/#commentshttp://www.digitaldev.com.br/2013/03/06/usando-mesmo-hd-externo-no-mac-os-x-windows-e-ubuntu/http://www.digitaldev.com.br/category/sistemas-operacionais/linux/http://www.digitaldev.com.br/category/servidores/web-servers/http://www.digitaldev.com.br/category/programacao/javascript/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/frameworks/android-sdk/http://www.digitaldev.com.br/category/linguagens-de-estilo/css/http://www.digitaldev.com.br/category/linguagens-de-marcacao/html/http://www.digitaldev.com.br/category/frameworks/http://www.digitaldev.com.br/category/banco-de-dados/postgresql/http://www.digitaldev.com.br/category/banco-de-dados/mysql/http://www.digitaldev.com.br/category/banco-de-dados/http://www.digitaldev.com.br/category/programacao/javascript/http://www.digitaldev.com.br/category/programacao/c-c/http://www.digitaldev.com.br/category/programacao/php/http://www.digitaldev.com.br/category/programacao/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=700#respondhttp://www.digitaldev.com.br/2013/01/18/entendendo-o-mvc-model-view-controller/http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/?replytocom=929#respond
  • 7/21/2019 Exemplo de MVC Com PHP e Outros Padres de Projeto

    33/33

    23/7/2014 Exemplo de MVC com PHP e outros padres de projeto

    Encontre-nos no Facebook

    DigitalDev

    2 9 0 p e s s o a s c u r t i r a m D i g i t a l D e v .

    Curtir

    ltimos Comentrios

    leonepgnem Instalando e configurando oZend FrameworkGustavo em Usando mesmo HD externono Mac OS X, Windows e UbuntuJoo Carlos Almeida em Usando mesmoHD externo no Mac OS X, Windows eUbuntu

    Parceiros

    Anotaes por Elaine Naomi

    Tags

    AgregaoAmbiente de DesenvolvimentoAmbiente deProgramaoBanco de dadosC++ClassesComposio Construtorescssdesign patterns

    DestrutoresEclipseEncapsulamento FacebookFrameworkHeranaInjeo SQLjQuerylinuxMetodologiasMinGWMVCMySQLOOPPadres de

    ProjetoPHPPHP/FIPHP/FI 2.0PHP 3PHP 4PHP5POOProgramao Orientada a ObjetoRasmus Lerdorf

    SeguranaSingletonSQLSQL InjectionTestes deSoftwareTutoriaisTutorialValidao de DadosZend EngineZend FrameworkZF

    Copyright

    2014 DigitalDev.

    Voltar ao topo

    Powered by WordPressand the Graphene Theme.

    http://www.graphene-theme.com/http://wordpress.org/http://www.digitaldev.com.br/tag/zf/http://www.digitaldev.com.br/tag/zend-framework/http://www.digitaldev.com.br/tag/zend-engine/http://www.digitaldev.com.br/tag/validacao-de-dados/http://www.digitaldev.com.br/tag/tutorial/http://www.digitaldev.com.br/tag/tutoriais/http://www.digitaldev.com.br/tag/testes-de-software/http://www.digitaldev.com.br/tag/sql-injection/http://www.digitaldev.com.br/tag/sql/http://www.digitaldev.com.br/tag/singleton/http://www.digitaldev.com.br/tag/seguranca/http://www.digitaldev.com.br/tag/rasmus-lerdorf/http://www.digitaldev.com.br/tag/programacao-orientada-a-objeto/http://www.digitaldev.com.br/tag/poo/http://www.digitaldev.com.br/tag/php-5/http://www.digitaldev.com.br/tag/php-4/http://www.digitaldev.com.br/tag/php-3/http://www.digitaldev.com.br/tag/phpfi-2-0/http://www.digitaldev.com.br/tag/phpfi/http://www.digitaldev.com.br/tag/php/http://www.digitaldev.com.br/tag/padroes-de-projeto/http://www.digitaldev.com.br/tag/oop/http://www.digitaldev.com.br/tag/mysql/http://www.digitaldev.com.br/tag/mvc/http://www.digitaldev.com.br/tag/mingw/http://www.digitaldev.com.br/tag/metodologias/http://www.digitaldev.com.br/tag/linux-2/http://www.digitaldev.com.br/tag/jquery/http://www.digitaldev.com.br/tag/injecao-sql/http://www.digitaldev.com.br/tag/heranca/http://www.digitaldev.com.br/tag/framework/http://www.digitaldev.com.br/tag/facebook/http://www.digitaldev.com.br/tag/encapsulamento/http://www.digitaldev.com.br/tag/eclipse/http://www.digitaldev.com.br/tag/destrutores/http://www.digitaldev.com.br/tag/design-patterns/http://www.digitaldev.com.br/tag/css-2/http://www.digitaldev.com.br/tag/construtores/http://www.digitaldev.com.br/tag/composicao/http://www.digitaldev.com.br/tag/classes/http://www.digitaldev.com.br/tag/c/http://www.digitaldev.com.br/tag/banco-de-dados-2/http://www.digitaldev.com.br/tag/ambiente-de-programacao/http://www.digitaldev.com.br/tag/ambiente-de-desenvolvimento/http://www.digitaldev.com.br/tag/agregacao/http://elainenaomi.wordpress.com/http://www.digitaldev.com.br/2013/03/06/usando-mesmo-hd-externo-no-mac-os-x-windows-e-ubuntu/#comment-936http://www.digitaldev.com.br/2013/03/06/usando-mesmo-hd-externo-no-mac-os-x-windows-e-ubuntu/#comment-937http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/#comment-938http://gravatar.com/leonepgnhttps://www.facebook.com/MarcioAdrielhttps://www.facebook.com/domingosnunes.tihttps://www.facebook.com/wenderpmachadohttps://www.facebook.com/WesleyOliveiraPaixaohttps://www.facebook.com/wandersonwillercpmhttps://www.facebook.com/matheusmmohttps://www.facebook.com/miqueias.rafaelhttps://www.facebook.com/DigitalDevhttps://www.facebook.com/DigitalDevhttps://www.facebook.com/DigitalDev