Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jerfeson

PHP Orientado a Objeto - MVC

Recommended Posts

Olá pessoal boa tarde, não sei se a minha dúvida será a dúvida de outras pessoas, venho do mundo da programação estruturada,e como todo processo, estou migrando para orientação a objeto,e está sendo um choque de realidade para mim tentar entender a orientação a objeto, para essanova fase resolvi elaborar um crud simples, que irá cadastrar dados ,alterar,excluir e listar os mesmo, paraisso criei os arquivos deconexãoao banco de dados,o arquiovo de persistencia de dados, e contoledesses dados, o modelo,como get e set e também a visão bem rudimentar apenas para testes, entretanto estou enfrentando problemas paral ligar todos esses arquivos... eu praticamente criei toda a estruturam mas como vou dizer que a visão irá acionar o controle,que irá acionar o modelo,e o modelo vai ligar os dados coletados lá na visão com a classe de persistencia, e adicionar esses dados ao banco de dados.... irei postar a estrutura dos arquivos abaixo,aguardo uma alma gentil a me ajudar.

 

Estrutura.

 

estrutura.png?1391285898

 

Códigos

_condig->conexao

<?php
/*
 * @author: Jerfeson Guerreiro
 * @project: sis_astral
 * @package admin
 *
*/

class conexao
    {

    private $db_host = 'localhost';
    private $db_user = 'root';
    private $db_pass = 'root';
    private $db_name = 'sis_astral';

    private $con = false;


    // Função para testar conexão com banco de dados
    public function connect(){

    if(!$this->con){

        $myconn = @mysql_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        if($myconn)
        {
            $seldb = @mysql_select_db($this->db_name, $myconn);
            if($seldb)
            {
                $this->con = true;
                return true;
            }
            else
            {
                return false;
            }
        }else
        {
            return false;
        }
    }
    else
        {
        return true;
        }
    }

    public function disconnect(){
        if($this->con){
            if(@mysql_close()){
                $this->con = false;
                return true;
            }
            else {
                return false;
            }
        }
    }
}



_config->Crud

<?php
/**
 * Created by PhpStorm.
 * User: Jerfeson Guerreiro
 * Date: 31/01/14
 * Time: 21:27
 */


class crud
{
    private $sql_ins = "";
    private $tabela = "";
    private $sql_sel = "";


    public function __construct($tabela)
    {

        $this->tabela = $tabela;
        return $this->tabela;

    }

    public function inserir ($campos,$valores)
    {
        $this->sql_ins = "INSERT INTO".$this->tabela."(campos) VALUES($valores)";
        if(!$this->sql_ins = mysql_query( $this->sql_ins))
        {
            die ("<center>ERRO NA CONLUSÃO"."<br/>".'LINHA:'.__LINE__."<br />".mysql_error()."<br /><a href='../_visao/index.php' >VOLTAR</a></center>");
        }
        else
        {
            print "<script> Location='index.php;'</script>";
        }
    }

    public function alterar($camposvalores, $where = NULL)
    {
        if($where)
        {
            $this->sql_upd = "UPDATE".$this->tabela."SET $camposvalores WHERE  $where";
        }
        else
        {
            $this->sql_upd = "UPDATE".$this->tabela."SET $camposvalores";
        }
        if(!$this->sql_upd =  mysql_query($this->sql_upd)){
            dir("<center>ERRO NA ATUALIZAÇÃO"."<br/>Linda>".__LINE__."<br/>".mysql_error()."<br/> <a href='../_visao/index.php'>VOLTAR<a/></center>");
        }
        else
        {
            print "<center>tualização efetuada com sucerro <br/> <a href='index.php'>Voltar</a></center>";
        }
    }

    public function excluir($where = NULL)
    {
        if($where)
        {
            $this->sql_sel = "SELECT * FROM".$this->tabela. "WHERE $where";
            $this->sql_del = "DELECT  FROM".$this->tabela. "WHERE $where";

        }
        else {
            $this->sql_sel = "SELECT * FROM".$this->tabela;
            $this->sql_del = "DELECT  FROM".$this->tabela;
        }


        $sel = mysql_query($this->sql_sel);
        $regs = mysql_num_rows($this->$sel);

        if($regs > 0){
            if($this->sql_del = mysql_query($this->sql_del)){
                die ("<center> ERRO NA EXCLUSÃO"."<br />Linha:".__LINE__."<br />".mysql_error()."<br /><a href='../_visao/index.php'></a>Voltar</center>");
            }
            else{
                print "<center>Escluido com Sucesso<a href='index.php'>Voltar</a></center>";
            }

        }
        else
        {
            print "<center>Registro não encontrado<a href='index.php'>Voltar</a></center>";
        }
    }
}

 

 

_controle->controle.php

<?php
/**
 * Created by Secode.
 * User: Jerfeson Guerreiro
 * Date: 01/02/14
 * Time: 17:44
 */

require('../_modelo/modelo.php');

$p = $_POST;

$cadastro = new cadastro();

$cadastro->setRazaoSocial($p['razaoSocial']);
$cadastro->setNomeFantasia($p['nomeFantasia']);
$cadastro->setCnpj($p['cnpj']);
$cadastro->setDataInscricao($p['dataInscricao']);
$cadastro->setEndereco($p['endereco']);
$cadastro->setCidade($p['cidade']);
$cadastro->setCep($p['cep']);
$cadastro->setBairro($p['bairro']);
$cadastro->setTelefone($p['telefone']);
$cadastro->setCelular($p['celular']);

_modelo->modelo.php

<?php
/**
 * Created by Secode.
 * User: Jerfeson Guerreiro
 * Date: 31/01/14
 * Time: 23:35
 */

 class cadastro
    {
    private $razaoSocial;
    private $nomeFantasia;
    private $cnpj;
    private $dataInscricao;
    private $endereco;
    private $cidade;
    private $cep;
    private $bairro;
    private $telefone;
    private $celular;

     /**
      * @param mixed $bairro
      */
     public function setBairro($bairro)
     {
         $this->bairro = $bairro;
     }

     /**
      * @return mixed
      */
     public function getBairro()
     {
         return $this->bairro;
     }

     /**
      * @param mixed $celular
      */
     public function setCelular($celular)
     {
         $this->celular = $celular;
     }

     /**
      * @return mixed
      */
     public function getCelular()
     {
         return $this->celular;
     }

     /**
      * @param mixed $cep
      */
     public function setCep($cep)
     {
         $this->cep = $cep;
     }

     /**
      * @return mixed
      */
     public function getCep()
     {
         return $this->cep;
     }

     /**
      * @param mixed $cidade
      */
     public function setCidade($cidade)
     {
         $this->cidade = $cidade;
     }

     /**
      * @return mixed
      */
     public function getCidade()
     {
         return $this->cidade;
     }

     /**
      * @param mixed $cnpj
      */
     public function setCnpj($cnpj)
     {
         $this->cnpj = $cnpj;
     }

     /**
      * @return mixed
      */
     public function getCnpj()
     {
         return $this->cnpj;
     }

     /**
      * @param mixed $dataInscricao
      */
     public function setDataInscricao($dataInscricao)
     {
         $this->dataInscricao = $dataInscricao;
     }

     /**
      * @return mixed
      */
     public function getDataInscricao()
     {
         return $this->dataInscricao;
     }

     /**
      * @param mixed $endereco
      */
     public function setEndereco($endereco)
     {
         $this->endereco = $endereco;
     }

     /**
      * @return mixed
      */
     public function getEndereco()
     {
         return $this->endereco;
     }

     /**
      * @param mixed $nomeFantasia
      */
     public function setNomeFantasia($nomeFantasia)
     {
         $this->nomeFantasia = $nomeFantasia;
     }

     /**
      * @return mixed
      */
     public function getNomeFantasia()
     {
         return $this->nomeFantasia;
     }

     /**
      * @param mixed $razaoSocial
      */
     public function setRazaoSocial($razaoSocial)
     {
         $this->razaoSocial = $razaoSocial;
     }

     /**
      * @return mixed
      */
     public function getRazaoSocial()
     {
         return $this->razaoSocial;
     }

     /**
      * @param mixed $telefone
      */
     public function setTelefone($telefone)
     {
         $this->telefone = $telefone;
     }

     /**
      * @return mixed
      */
     public function getTelefone()
     {
         return $this->telefone;
     }




}

_Visao->index.php

<?php
/**
 * Created by Secode.
 * User: Jerfeson Guerreiro
 * Date: 01/02/14
 * Time: 17:59
 */
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require("../_controle/controle.php");
}

?>

<form action="" method="post">
    Razão Social:       <input type="text" name="razaoSocial" /><br />
    Nome Fantasia:      <input type="text" name="nomeFantasia"/><br />
    CNPJ:               <input type="text" name="cnpj"/><br />
    Data de Inscrição:  <input type="date" name="dataInscricao"/><br />
    Endereço:           <input type="text" name="endereco"/><br />
    Cidade:             <input type="text" name="cidade"/><br />
    CEP:                <input type="text" name="cep"/><br />
    Bairro:             <input type="text" name="bairro"/><br />
    Telefone:           <input type="text" name="telefone"/><br />

    <input type="submit" value="Enviar">


</form>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu e utilizo um framework chamado "Yii Framework PHP", só no controle você saiu um pouco do padrão que eu estou acostumado a ver, o controller que chama a view (não o contrário).

 

nos frameworks que eu já utilizei funciona assim:

 

index > roteador > controller (usa o model) > view

 

Explicando:

  1. O arquivo "index.php" recebe todas as requisições (exceto estáticas, como imagens, css)
  2. Uma classe Roteadora é acionada, e escolhe qual Controller (é uma classe também) deve ser chamado
  3. Exemplo, "page/edit" chama a ação edit (que é um método da classe Page)
  4. O ação "edit" chama uma visualização, exemplo "views/edit.php"

 

Vou citar a estrutura adotada pelo Yii Framework (que também é adotada por outros também)

  • index.php
  • protected/
    • controllers/
      • PageController.php
    • models/
      • Page.php
    • views/
      • page/
        • edit.php
        • view.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Eu e utilizo um framework chamado "Yii Framework PHP", só no controle você saiu um pouco do padrão que eu estou acostumado a ver, o controller que chama a view (não o contrário).

 

nos frameworks que eu já utilizei funciona assim:

 

index > roteador > controller (usa o model) > view

 

Explicando:

  1. O arquivo "index.php" recebe todas as requisições (exceto estáticas, como imagens, css)
  2. Uma classe Roteadora é acionada, e escolhe qual Controller (é uma classe também) deve ser chamado
  3. Exemplo, "page/edit" chama a ação edit (que é um método da classe Page)
  4. O ação "edit" chama uma visualização, exemplo "views/edit.php"

 

Vou citar a estrutura adotada pelo Yii Framework (que também é adotada por outros também)

  • index.php
  • protected/
    • controllers/
      • PageController.php
    • models/
      • Page.php
    • views/
      • page/
        • edit.php
        • view.php

 

 

 

 

 

 

Obrigado pela orientação, eu sei que existem framworks,mas queria aprender sem framework, para entender os processos, e depois passar a usar o framework, mesmo assim obrigado.... estou prospectando trabalhar com zend framework

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá.

 

O primeiro ponto é que estrutura de pastas não define ou muda absolutamente NADA. Isso é apenas uma questão de organização e não há padrão algum definido.

 

 

class conexao

 

Classes começam com letra maiúscula (StudlyCaps). É um padrão seguido por todas as linguagens há décadas.

 

 

    private $db_host = 'localhost';
    private $db_user = 'root';
    private $db_pass = 'root';
    private $db_name = 'sis_astral';

 

E se você quiser trocar isso? Terá que editar a classe, o que a torna não-reutilizável. Configuração não é parte da classe, é parte do objeto. Esses dados deveriam ser passados pelo construtor.

 

 

 

        $myconn = @mysql_connect($this->db_host, $this->db_user, $this->db_pass, $this->db_name);

 

mysql_* produz E_DEPRECATED a partir do PHP 5.5 e não tem suporte há anos. Além disso, arroba é uma má prática.

 

A PDO substitui toda essa classe facilmente.

 

 

                return true;

 

Se sua intenção é tratar erros (o que é), use exceptions. Retornar true/false para isso é uma gambiarra tamanha (admissível em C).

 

 

    private $sql_ins = "";
    private $tabela = "";
    private $sql_sel = "";

 

Todo o propósito da orientação a objetos vai por água abaixo aqui.

 

Crud pode ser feito em qualquer tipo de data storage, não somente num banco de dados. Aqui você precisa ter uma abstração para diminuir o acoplamento. Guarde bem essas duas palavras, são bem importantes em OO.

 

 

        return $this->tabela;

 

Todo construtor é void, ou seja, não retorna nada. Construtores apenas constroem objetos.

 

 

            die ("<center>ERRO NA CONLUSÃO"."<br/>".'LINHA:'.__LINE__."<br />".mysql_error()."<br /><a href='../_visao/index.php' >VOLTAR</a></center>");

 

Por que se a consulta falhar o sistema tem que morrer? Novamente, use exceptions.

 

 

print "<script> Location='index.php;'</script>";

 

Side-effect não relacionado com CRUD, separe as responsabilidades das classes. O resultado disso é um erro Headers already sent piscando na telinha.

 

 

require('../_modelo/modelo.php');

 

Autoloading e PSR-0.

 

 

$p = $_POST;

$cadastro = new cadastro();

$cadastro->setRazaoSocial($p['razaoSocial']);
$cadastro->setNomeFantasia($p['nomeFantasia']);
$cadastro->setCnpj($p['cnpj']);
$cadastro->setDataInscricao($p['dataInscricao']);
$cadastro->setEndereco($p['endereco']);
$cadastro->setCidade($p['cidade']);
$cadastro->setCep($p['cep']);
$cadastro->setBairro($p['bairro']);
$cadastro->setTelefone($p['telefone']);
$cadastro->setCelular($p['celular']);

 

E se esses campos não estiverem preenchidos? Um array não garante nada, é necessário, no mínimo, um isset.

 

Outro ponto é que um cadastro deveria ser um simples VO, não há a necessidade de setters, basta um construtor.

 

 

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require("../_controle/controle.php");
}

 

Você precisa de um URL router. Não é responsabilidade da view chamar um controller.

 

:seta: Classes não são repositórios de procedimentos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá.

 

O primeiro ponto é que estrutura de pastas não define ou muda absolutamente NADA. Isso é apenas uma questão de organização e não há padrão algum definido.

 

 

Classes começam com letra maiúscula (StudlyCaps). É um padrão seguido por todas as linguagens há décadas.

 

 

E se você quiser trocar isso? Terá que editar a classe, o que a torna não-reutilizável. Configuração não é parte da classe, é parte do objeto. Esses dados deveriam ser passados pelo construtor.

 

 

 

mysql_* produz E_DEPRECATED a partir do PHP 5.5 e não tem suporte há anos. Além disso, arroba é uma má prática.

 

A PDO substitui toda essa classe facilmente.

 

 

Se sua intenção é tratar erros (o que é), use exceptions. Retornar true/false para isso é uma gambiarra tamanha (admissível em C).

 

 

Todo o propósito da orientação a objetos vai por água abaixo aqui.

 

Crud pode ser feito em qualquer tipo de data storage, não somente num banco de dados. Aqui você precisa ter uma abstração para diminuir o acoplamento. Guarde bem essas duas palavras, são bem importantes em OO.

 

 

Todo construtor é void, ou seja, não retorna nada. Construtores apenas constroem objetos.

 

 

Por que se a consulta falhar o sistema tem que morrer? Novamente, use exceptions.

 

 

Side-effect não relacionado com CRUD, separe as responsabilidades das classes. O resultado disso é um erro Headers already sent piscando na telinha.

 

 

Autoloading e PSR-0.

 

 

E se esses campos não estiverem preenchidos? Um array não garante nada, é necessário, no mínimo, um isset.

 

Outro ponto é que um cadastro deveria ser um simples VO, não há a necessidade de setters, basta um construtor.

 

 

Você precisa de um URL router. Não é responsabilidade da view chamar um controller.

 

:seta: Classes não são repositórios de procedimentos.

 

 

Obrigado suas orientações seram de grade ajuda para o meu conhecimento.... agradeço a sua paciencia em pontuar os pontos relevantes,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.