exemplo de mvc com php

Upload: aureliano-duarte

Post on 10-Feb-2018

241 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/22/2019 Exemplo de MVC Com PHP

    1/40

    Exemplo de MVC com PHP

    MVC,Padres de Projeto

    porTarcsio

    Nesse artigo irei demonstrar na prtica, a aplicao do padro de projeto MVC comPHP. Para isso, construirei um aplicativo de Agenda de Contatos Telefnicosconforme requisitos funcionais, diagramas e cdigo que sero mostrados ao longo dessetexto. Mas, antes de comear, aconselho a vocs que leiam o artigo de introduo aMVC, 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 sobre as responsabilidades dos diretrios e arquivos logo abaixo.

    Imagem 1Hierarquia de Diretrios e Pastas

    Diretrio controllers

    http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-13.51.08.pnghttp://www.digitaldev.com.br/wp-content/uploads/2012/07/MVC1.jpghttp://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-13.51.08.pnghttp://www.digitaldev.com.br/wp-content/uploads/2012/07/MVC1.jpghttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://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/
  • 7/22/2019 Exemplo de MVC Com PHP

    2/40

    Conforme se pode deduzir pelo nome, irei us-lo para guardar as classes da camada decontrole do sistema, as famosas classes controladoras ou controllers, responsveis porfazer o intermdio entre a camada de dados (models ou modelos) e visualizao (views),conforme o artigo de introduo a MVC citado acima.

    Diretrio databases

    Por se tratar de um projeto apenas de exemplo, irei persistir os dados dos contatos etelefones usando um banco de dadosSQLite, nesse diretrio que o arquivo referenteao 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 porexemplo, classes de filtros de dados, validaes genricas, helpers (caso haja algum),interfaces e abstraes no ligadas camada de negcio do sistema. Se estivesseconstruindo um framework em PHP, guardaria as classes do mesmo nesse diretrio.

    Diretrio models

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

    Diretrio views

    Esse o diretrio onde guardarei os arquivosHTML do sistema, tais arquivosrepresentam a camada de visualizao (view), da qual foi falada no artigo de introduoao 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 classesnecessrias para a separao do sistemas em camadas (ModeloModel, VisoView ,ControladorController). A primeira delas que mostrarei, a de controlador genrico,no diretamente ligado s regras de negcio do sistema de Agenda Telefnica. Veja oexemplo abaixo.

    1234

  • 7/22/2019 Exemplo de MVC Com PHP

    3/40

    56789

    1011121314151617181920

    2122232425262728

    * @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1** Camada - Controladores ou Controllers* Diretrio Pai - controllers

    * Arquivo - IndexController.php*/classIndexController{

    /*** Ao que dever ser executada quando* nenhuma outra for especificada, do mesmo jeito que o* arquivo index.html ou index.php executado quando nenhum* referenciado*/publicfunctionindexAction(){

    //redirecionando para a pagina de lista de contatos

    header('Location: ?controle=Contato&acao=listarContato');

    }}?>

    Conforme vocs devem ter visto acima, usei o sufixo Controller no nome da classe eAction no nome do mtodo. Esse o padro de nomenclatura que irei utilizar em todasas outras classes da camada Controle e seus mtodos. Alm disso, nomearei os arquivosque iro conter as classes com o mesmo nome da prpria classe.

    A segunda classe que implementarei ser a Application. A responsabilidade da mesmaser a de verificar qual classe da camada de controle (Controller) e qual mtodo daclasse (Action) o usurio deseja executar. D uma olhada no cdigo abaixo, espero queele seja simples o suficiente para esclarecer seu modo de funcionamento.

    12

    345678910111213

    1415

  • 7/22/2019 Exemplo de MVC Com PHP

    4/40

    1617181920

    2122232425262728293031

    323334353637383940414243444546474849505152

    5354555657585960616263

    6465

    * Verifica qual classe controlador (Controller) o usurio desejachamar* e qual mtodo dessa classe (Action) deseja executar * Caso o controlador (controller) no seja especificado, oIndexControllers ser o padro* Caso o mtodo (Action) no seja especificado, o indexAction ser

    o padro** @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1**/classApplication{

    /*** Usada pra guardar o nome da classe* de controle (Controller) a ser executada* @var string*/

    protected$st_controller;

    /*** Usada para guardar o nome do metodo da* classe de controle (Controller) que dever ser executado* @var string*/protected$st_action;

    /*** Verifica se os parmetros de controlador (Controller) e ao

    (Action) foram* passados via parmetros "Post" ou "Get" e os carrega tais

    dados* nos respectivos atributos da classe*/privatefunctionloadRoute(){

    /** Se o controller nao for passado por GET,* assume-se como padro o controller 'IndexController';*/$this->st_controller = isset($_REQUEST['controle'])

    ? $_REQUEST['controle'] : 'Index';

    /** Se a action nao for passada por GET,* assume-se como padro a action 'IndexAction';*/$this->st_action = isset($_REQUEST['acao'])

    ? $_REQUEST['acao'] : 'index';}

    /**** Instancia classe referente ao Controlador (Controller) e

    executa* mtodo referente e acao (Action)* @throws Exception*/publicfunctiondispatch()

  • 7/22/2019 Exemplo de MVC Com PHP

    5/40

    6667686970

    7172737475767778798081

    828384858687888990919293949596979899100101102

    103104105

    {$this->loadRoute();

    //verificando se o arquivo de controle existe$st_controller_file = 'controllers/'.$this-

    >st_controller.'Controller.php';

    if(file_exists($st_controller_file)) require_once$st_controller_file; else

    thrownewException('Arquivo '.$st_controller_file.' naoencontrado');

    //verificando se a classe existe$st_class= $this->st_controller.'Controller';if(class_exists($st_class))

    $o_class= new$st_class;else

    thrownewException("Classe '$st_class' nao existe noarquivo '$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

    thrownewException("Metodo '$st_method' nao existe naclasse $st_class'");

    }

    /*** Redireciona a chamada http para outra pgina* @param string $st_uri*/staticfunctionredirect( $st_uri){

    header("Location: $st_uri");}

    }?>

    Apesar da classe acima no ter semelhana alguma com a classe IndexController queescrevi, ela tambm faz parte da camada de controle (Controller), mas est num nvelmais acima. O fato dela ser responsvel por verificar qual controlador (Controller) equal mtodo (Action) ir executar, faz da mesma o corao do sistema.

    A terceira classe que irei implementar ser responsvel por cuidar da camada devisualizao. Apesar de cdigo um pouco extenso, ela uma classe sem muitas

    funcionalidade, mas poder ser enriquecida de acordo com nossas necessidades futuras.

  • 7/22/2019 Exemplo de MVC Com PHP

    6/40

    12345

    678910111213141516

    171819202122232425262728293031323334353637

    3839404142434445464748

    4950

  • 7/22/2019 Exemplo de MVC Com PHP

    7/40

    5152535455

    5657585960616263646566

    676869707172737475767778798081828384858687

    8889909192939495969798

    99100

    exists");}

    /*** Retorna o nome do arquivo que deve ser renderizado* @return string

    */publicfunctiongetView(){

    return$this->st_view;}

    /*** Define os dados que devem ser repassados view* @param Array $v_params*/publicfunctionsetParams(Array $v_params){

    $this->v_params = $v_params;

    }

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

    visualizao* @return Array*/publicfunctiongetParams(){

    return$this->v_params;}

    /*** Retorna uma string contendo todo* o conteudo do arquivo de visualizao** @return string*/publicfunctiongetContents(){

    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*/publicfunctionshowContents(){

    echo$this->getContents(); exit;

    }}?>

  • 7/22/2019 Exemplo de MVC Com PHP

    8/40

    101102103104105

    106107108109110111112113

    Os dados de algumas classes da camada de modelo deveropersistirno banco de dados,para isso, ser necessrio a implementao de pequeno bloco de cdigo responsvel

    pela conexo entre o sistema e oSGDB. A alternativa que adotarei ser a deimplementar uma classe abstrata, que dever ser herdada pelas classes em que os dadosdevero ser armazenados no banco de dados. Veja cdigo da classe abstrata a seguir.

    123456

    7891011121314151617

    1819202122232425262728

    2930

  • 7/22/2019 Exemplo de MVC Com PHP

    9/40

    3132333435

    3637383940414243444546

    474849

    $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*/

    }}?>

    Conforme Vocs j devem ter visto, a classe PersistModelAbstract faz referncia aoarquivo db.sq3 dentro do diretrio databases, esse arquivo ser o responsvel porguardar nossos dados. Irei mostrar isso na prtica com o continuar desse artigo.

    Implementarei tambm, duas outras pequenas classes, a primeira ser usada para filtraros dados passados via POST e GET e a segunda ser usada para validar os dados. Ireicham-las de DataFilter e DataValidator, respectivamente.

    123456789

    1011121314151617181920

    2122

  • 7/22/2019 Exemplo de MVC Com PHP

    10/40

    2324252627

    2829303132333435363738

    39404142434445464748

    * @return string*/staticfunctionnumeric( $st_data){

    $st_data= preg_replace("([[:punct:]]|[[:alpha:]]|)",'',$st_data);

    return$st_data;}

    /**** Retira tags HTML / XML e adiciona "\" antes* de aspas simples e aspas duplas* @param string $st_string*/staticfunctioncleanString( $st_string){

    returnaddslashes(strip_tags($st_string)); }}

    ?>

    12345678

    910111213141516171819

    2021

  • 7/22/2019 Exemplo de MVC Com PHP

    11/40

    2223242526

    2728293031323334353637

    3839404142434445464748495051525354

    * Verifica se o dado passado e um numero* @param mixed $mx_value;* @return boolean*/staticfunctionisNumeric( $mx_value){

    $mx_value= str_replace(',', '.', $mx_value);if(!(is_numeric($mx_value))) returnfalse;

    returntrue;}

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

    if(!DataValidator::isNumeric($mx_value)) returnfalse;

    if(preg_match('/[[:punct:]&^-]/', $mx_value) > 0)returnfalse;

    returntrue;}

    }?>

    Por fim, irei implementaro cdigo do arquivo index.php, o mesmo serextremamente simples. Veja abaixo.

    1234567891011

    1213

  • 7/22/2019 Exemplo de MVC Com PHP

    12/40

    1415161718

    19202122

    error_reporting(E_ALL);

    require_once'lib/Application.php'; $o_Application= newApplication();$o_Application->dispatch(); ?>

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

    Imagem 2Hierarquia de Diretrios e Pastas

    A Camada de Negcios

    Agora, com as classes do sistema implementadas, irei finalmente me preocupar com asregras de negcio 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/22/2019 Exemplo de MVC Com PHP

    13/40

    Imagem 3Diagrama de Casos de Uso

    Diagrama de Classe

    Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema deAgenda Telefnica, a diagramao das classes que implementei acima no serabordada.

    http://www.digitaldev.com.br/wp-content/uploads/2012/08/diag_cu.jpg
  • 7/22/2019 Exemplo de MVC Com PHP

    14/40

    Imagem 4Diagrama de Classes

    Diagrama de Entidade Relacionamento

    Pelo fato da necessidade da persistir os dados de contato e dos telefones, ser necessrioduas tabelas para guardar os dados das classes. Veja o Diagrama de EntidadeRelacionamento (DER) abaixo.

    Imagem 5Diagrama de Entidade Relacionamento

    Agora que j tenho a arquitetura da camada de negcio j definida, o proximo passo implementar as classes responsveis por gerenciar as mesmas. Isso mesmo, estou mereferendo s classes Contato e Telefone, e como eu j havia falado, os dados das

    mesmas devem persistir no banco de dados, por esse motivo, elas devem herdar a classePersistModelAbstract.

    12

    34

  • 7/22/2019 Exemplo de MVC Com PHP

    15/40

    56789

    1011121314151617181920

    212223242526272829303132333435363738394041

    4243444546474849505152

    5354

    * Responsvel por gerenciar e persistir os dados dos* Contatos da Agenda Telefnica** @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1

    ** Camada - Modelo ou Model.* Diretrio Pai - models* Arquivo - ContatoModel.php**/classContatoModel extendsPersistModelAbstract {

    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*/

    publicfunctionsetId( $in_id){

    $this->in_id = $in_id;return$this;

    }

    publicfunctiongetId(){

    return$this->in_id;}

    publicfunctionsetNome( $st_nome){

    $this->st_nome = $st_nome;

    return$this;}

    publicfunctiongetNome(){

    return$this->st_nome;}

    publicfunctionsetEmail( $st_email){

    $this->st_email = $st_email;return$this;

    }

    publicfunctiongetEmail()

  • 7/22/2019 Exemplo de MVC Com PHP

    16/40

    5556575859

    6061626364656667686970

    717273747576777879808182838485868788899091

    9293949596979899100101102

    103104

    {return$this->st_email;

    }

    /*** Retorna um array contendo os contatos

    * @param string $st_nome* @return Array*/publicfunction_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= newContatoModel();$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*/publicfunctionloadById( $in_id){

    $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

  • 7/22/2019 Exemplo de MVC Com PHP

    17/40

    105106107108109

    110111112113114115116117118119120

    121122123124125126127128129130131132133134135136137138139140141

    142143144145146147148149150151152

    153154

    * @return integer*/publicfunctionsave(){

    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= "UPDATEtbl_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 doPDO::lastInsertId() no funciona com sqlite*/if($this->o_db-

    >getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite'){

    $o_ret= $this->o_db->query('SELECTlast_insert_rowid() AS con_in_id')->fetchObject();

    return$o_ret->con_in_id; }else

    return$this->o_db->lastInsertId(); }

    elsereturn$this->in_id;}catch(PDOException $e){

    throw$e;}returnfalse;

    }

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

    */publicfunctiondelete(){

  • 7/22/2019 Exemplo de MVC Com PHP

    18/40

    155156157158159

    160161162163164165166167168169170

    171172173174175176177178179180181182183184185186187188189190191

    192193194195196197198199200201202

    203204

    if(!is_null($this->in_id)) {

    $st_query= "DELETEFROMtbl_contato

    WHERE con_in_id = $this->in_id";if($this->o_db->exec($st_query) > 0)

    returntrue;}returnfalse;

    }

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

    /*

    * No caso do Sqlite, o AUTO_INCREMENT automtico na chaveprimaria 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_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;}

    }}?>

  • 7/22/2019 Exemplo de MVC Com PHP

    19/40

    205206207208209

    210211212213214215216217218219220

    221222223224225226

    Agora a vez da classe TelefoneModel ser implementada.

    1

    23456789101112

    1314151617181920212223

    2425

  • 7/22/2019 Exemplo de MVC Com PHP

    20/40

    2627282930

    3132333435363738394041

    424344454647484950515253545556575859606162

    6364656667686970717273

    7475

    * Setters e Getters da* classe TelefoneModel*/

    publicfunctionsetId( $in_id){

    $this->in_id = $in_id;return$this;}

    publicfunctiongetId(){

    return$this->in_id;}

    publicfunctionsetDDD( $in_ddd){

    $this->in_ddd = $in_ddd;return$this;

    }

    publicfunctiongetDDD(){

    return$this->in_ddd;}

    publicfunctionsetTelefone( $in_telefone){

    $this->in_telefone = $in_telefone;return$this;

    }

    publicfunctiongetTelefone(){

    return$this->in_telefone; }

    publicfunctionsetContatoId( $in_contato_id){

    $this->in_contato_id = $in_contato_id;return$this;

    }

    publicfunctiongetContatoId(){

    return$this->in_contato_id; }

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

    { $st_query= "SELECT * FROM tbl_telefone WHERE con_in_id =$in_contato_id";

  • 7/22/2019 Exemplo de MVC Com PHP

    21/40

    7677787980

    8182838485868788899091

    9293949596979899100101102103104105106107108109110111112

    113114115116117118119120121122123

    124125

    $v_telefones= array();try{

    $o_data= $this->o_db->query($st_query);while($o_ret= $o_data->fetchObject()){

    $o_telefone= newTelefoneModel();$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*/publicfunctionloadById( $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){}returnfalse;

    }

    /*** 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*/publicfunctionsave(){

    if(is_null($this->in_id)) $st_query= "INSERT INTO tbl_telefone

    (

    con_in_id,tel_in_ddd,tel_in_telefone

  • 7/22/2019 Exemplo de MVC Com PHP

    22/40

    126127128129130

    131132133134135136137138139140141

    142143144145146147148149150151152153154155156157158159160161162

    163164165166167168169170171172173

    174175

    )VALUES(

    $this->in_contato_id, '$this->in_ddd','$this->in_telefone'

    );";else$st_query= "UPDATE

    tbl_telefoneSET

    tel_in_ddd = '$this->in_ddd',tel_in_telefone = '$this->in_telefone'

    WHEREtel_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('SELECTlast_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;}returnfalse;

    }/*** Deleta os dados persistidos na tabela de* telefone usando como referencia, o id da classe.*/publicfunctiondelete(){

    if(!is_null($this->in_id)) {

    $st_query= "DELETEFROMtbl_telefone

    WHERE tel_in_id = $this->in_id";

    if($this->o_db->exec($st_query) > 0)returntrue;}

  • 7/22/2019 Exemplo de MVC Com PHP

    23/40

    176177178179180

    181182183184185186187188189190191

    192193194195196197198199200201202203204205206207208209210211212

    213214215216217218219220221222223

    224225

    returnfalse;}

    /*** Cria tabela para armazernar os dados de telefone, caso* ela ainda no exista.* @throws PDOException*/privatefunctioncreateTableTelefone() {

    /** 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;}

    }}?>

  • 7/22/2019 Exemplo de MVC Com PHP

    24/40

    226227228229230

    231232233234235236237238239240241

    242243244245246247248

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

    123456789

    10111213141

    51

  • 7/22/2019 Exemplo de MVC Com PHP

    25/40

    61718

    19202122232

    425262728293031323334

    35363738394

    04

    //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= newView('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

    */publicfunctionmanterContatoAction() {

    $o_contato= newContatoModel();

    //verificando se o id do contato foi passadoif( isset($_REQUEST['in_con']) )

    //verificando se o id passado validoif( 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 decontatos

    if($o_contato->save() > 0)Application::redirect('?controle=Contato&acao=listarC

    ontato');}

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

    }

    /*** Gerencia a requisies de excluso dos contatos*/publicfunctionapagarContatoAction() {

    if( DataValidator::isNumeric($_GET['in_con']) ){

    //apagando o contato$o_contato= newContatoModel();$o_contato->loadById($_GET['in_con']);

  • 7/22/2019 Exemplo de MVC Com PHP

    26/40

    14243

    44454647484

    950515253545556575859

    60616263646

    56

    $o_contato->delete();

    //Apagando os telefones do contato$o_telefone= newTelefoneModel();$v_telefone= $o_telefone->_list($_GET['in_con']);foreach($v_telefone AS $o_telefone)

    $o_telefone->delete(); Application::redirect('?controle=Contato&acao=listarContato');

    }}

    }?>

  • 7/22/2019 Exemplo de MVC Com PHP

    27/40

    66768

    69707172737

    475767778798081828384

    85868788899

    09

  • 7/22/2019 Exemplo de MVC Com PHP

    28/40

    19293

    94

    e por sua vez a classe TelefoneController

    123456

    789101112131415161718

    19202122232

    42

  • 7/22/2019 Exemplo de MVC Com PHP

    29/40

    52627

    28293031323

    334353637383940414243

    44454647484

    95

    $o_telefone= newTelefoneModel();

    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= newView('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*/

    publicfunctionapagarTelefoneAction() {if( isset($_GET['in_tel']) )

    if( DataValidator::isInteger($_GET['in_tel'])){

    $o_telefone= newTelefoneModel(); $o_telefone->loadById($_GET['in_tel']); $o_telefone->delete(); Application::redirect('?controle=Telefone&acao=listar

    Telefones&in_con='.$_GET['in_con']); }

    }}

    ?>

  • 7/22/2019 Exemplo de MVC Com PHP

    30/40

    05152

    53545556575

    859606162636465666768

    69707172737

    47

  • 7/22/2019 Exemplo de MVC Com PHP

    31/40

    57677

    78798081828

    384858687

    Arquivos de visualizao ou views

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

    ArquivolistarContatos.phtmlDiretrio Paiviews

    12

    345678910111213

    1415

    Agenda Telefnica - Exemplo de MVC com PHP

    http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd
  • 7/22/2019 Exemplo de MVC Com PHP

    32/40

    1617181920

    2122232425262728293031

    323334353637383940414243444546474849505152

    5354555657585960616263

    ID

    Nome

    E-mail

    Aes

    Novo

    Contato

  • 7/22/2019 Exemplo de MVC Com PHP

    33/40

    ArquivolistarTelefones.phtmlDiretrio Paiviews

    12

    34567891011121314151617181920212223

    2425262728293031323334

    3536373839404142434445

    4647

    Agenda Telenica - Exemplo de MVC com PHP

    Contato

    ID

    Nome

    E-mail

    Telefones

    ID

    http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd
  • 7/22/2019 Exemplo de MVC Com PHP

    34/40

    4849505152

    5354555657585960616263

    646566676869707172737475767778798081828384

    8586878889909192939495

    9697

    DDD

    Telefone

    Aes

    Voltar

  • 7/22/2019 Exemplo de MVC Com PHP

    35/40

    ArquivomanterContato.phtmlDiretrio Paiviews

    12

    34567891011121314151617181920212223

    2425262728293031323334

    3536373839404142434445

    4647

    Agenda Telefnica - Exemplo de MVC com PHP

    Nome

    E-mail

    Aes

  • 7/22/2019 Exemplo de MVC Com PHP

    36/40

    484950

    ArquivomanterTelefone.phtml

    Diretrio Paiviews

    12345678910111213141516171819

    2021222324252627282930

    3132333435363738394041

    4243

    Agenda Telefnica - Exemplo de MVC com PHP

    Contato

    ID

    Nome

    E-mail

    http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd
  • 7/22/2019 Exemplo de MVC Com PHP

    37/40

    4445464748

    4950515253545556575859

    606162636465666768697071727374757677787980

    818283848586

    Telefones

    DDD

    Telefone

    Aes

  • 7/22/2019 Exemplo de MVC Com PHP

    38/40

    Aps o cdigo implementado, para selecionar o Controlador e a Ao que querexecutar, basta envia-las via GET ou POST, como por exemplo?controle=Contato&acao=listarContato . Com esses parmetros, o mtodolistarContatoAction da classe ContatoController ser executado.

    Para entender um pouco melhor o funcionamento desse programa, visualize oDiagrama de Sequncia da funcionalidade Listar Contatos mostrado na Imagem 6abaixo. Ele ser executado por padro quando nenhum outro for requisitado pelousurio.

    Imagem 6Diagrama de Sequncia do Caso de Uso Listar Contatos

    Quer ver isso funcionando? Acesse o linkhttp://digitaldev.com.br/exemploMVC/

    Quer fazer download do cdigo para estudar? Acesse o link

    http://digitaldev.com.br/downloads/exemploMVC.zip

    Conectando a agenda com o MySQL

    Caso voc queira conectar a aplicao desenvolvida com o MySQL, basta editar oarquivo lib/PersistModelAbstract.php e deix-lo como abaixo, preenchendo apenas osdados da sua conexo e credenciais referentes.

    12

    34

  • 7/22/2019 Exemplo de MVC Com PHP

    39/40

    56789

    1011121314151617181920

    212223242526272829303132333435363738394041

    42434445464748

    * @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1** Diretrio Pai - lib* Arquivo - PersistModelAbstract.php

    */abstractclassPersistModelAbstract {

    /*** Varivel responsvel por guardar dados da conexo do banco* @var resource*/protected$o_db;

    function__construct(){

    /*// Inicio de conexo com SQLite$this->o_db = new PDO("sqlite:./databases/db.sq3");$this->o_db->setAttribute ( PDO::ATTR_ERRMODE ,

    PDO::ERRMODE_EXCEPTION );// Fim de conexo com SQLite*/

    //Inicio de conexo com MySQL$st_host= 'ip ou host';$st_banco= 'bancodedados';$st_usuario= 'usuario';$st_senha= 'senha';

    $st_dsn= "mysql:host=$st_host;dbname=$st_banco";$this->o_db = newPDO(

    $st_dsn,$st_usuario,$st_senha

    );//Fim de conexo com MySQL

    }}?>

    Mais sobre MVC com PHP

    H um tempo atrs, encontrei um material em vdeo muito bom sobre como montar umMini-Framework no padro MVC com PHP. Para acessar esse videos, clique emCriando um Mini Framework PHP 5 com MVC

    http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/
  • 7/22/2019 Exemplo de MVC Com PHP

    40/40

    Mais sobre Padres de Projeto

    O MVC um dos Padres de Projetos mais importantes hoje em dia, mas no estsozinho. Existem vrios outros padres por ai, eles nos ajudam a organizar o cdigo,resolver problemas que costumamos enfrentar no dia-dia da Programao Orientada aObjeto. Sendo assim, vale muito a pena estudar sobre eles, pois um bom programadorno aquele que apenas codifica solues excepcionais, mas tambm o que consegueorganizar com clareza seu cdigo. Veja uma lista de alguns padres organizados porsuas categorias 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