Ir para conteúdo

POWERED BY:

Arquivado

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

Prove Yourself

Minha implementação MVC

Recommended Posts

Boa tarde, estou tentando aprender MVC e gostaria de saber como está este exemplo que fiz. Ele está correto? O que melhorar?

O método getCar no model representa uma consulta no banco de dados que retorna um objeto carro. Não fiz a implementação real da coisa.

index.php

<?php
function __autoload($class) {
    $classDirs = array('model', 'controll', 'view');
    
    foreach($classDirs as $dir) {
        $classFile = $dir . '/' . $class . '.class.php';
        
        if(file_exists($classFile))
            require_once($classFile);
    }
}

$module = $_GET['module'];
$action = $_GET['action'];

if(class_exists($module)) {
    $moduleObject = new $module;
    
    if(method_exists($moduleObject, $action))
        $moduleObject->$action();
    else
        $moduleObject->index();
}
else
    echo 'Módulo Inválido!';
?>
model/Car.class.php
<?php
class Car {
    function getCar() {
        $car->id = 7;
        $car->brand = 'fiat';
        $car->model = 'uno';
        $car->year = 2001;
        
        return $car;
    }
    
    function anotherMethod($number) {
        return $number * 53;
    }
}
?>
CarControll.class.php
<?php
class CarControll {
    public function index() {
        $car = new Car();
        $car = $car->getCar();
        
        require_once('view/car.tpl.php');
    }
}
?>
view/car.tpl.php
<?php
<html>
<head>
</head>
<body>
    <h1>CAR Profile</h1>
    <table>
        <tr>
            <th>Brand</th>
            <th>Model</th>
            <th>Year</th>
        </tr>
        <tr>
            <td><?php echo $car->brand; ?></td>
            <td><?php echo $car->model; ?></td>
            <td><?php echo $car->year; ?></td>
        </tr>
    </table>
</body>
</html>
Acesso o site assim: http://localhost/mvc/?module=CarControll e ele carrega o método index.

Agradeço todo tipo de ajuda, valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O método getCar no model representa uma consulta no banco de dados que retorna um objeto carro. Não fiz a implementação real da coisa.

 

class Car {
    function getCar() {
        $car->id = 7;
        $car->brand = 'fiat';
        $car->model = 'uno';
        $car->year = 2001;
        
        return $car;
    }
...
}

class CarControll {
    public function index() {
        $car = new Car();
        $car = $car->getCar();
        
        require_once('view/car.tpl.php');
    }
}

Esses dois karas precisam ser revistos, na primeira classe você está definindo as propriedades id, brand, model e year para uma variável não declarada e eu acredito que sua intensão era definir esses valores para a instância do seu objeto.

 

Na segunda classe o problema é consequencia do primeiro, por exemplo:

 

$car = new Car();
$car = $car->getCar();
$car->anotherMethod( 10 ); //Call to undefined method stdClass::anotherMethod()

Isso ocorre porque você está redefinindo o objeto da classe Car com um objeto da stdClass.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade esta foi apenas uma forma rápida de obter dados... O array simulando um banco de dados, entende? Entendi a sua colocação, sobre os valores sendo parte da instância em questão... No mais, está certo?

Obrigado pela ajuda, um grande abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

dentro do autoload há um loop para incluir varios arquivos em pastas diferentes

 

function __autoload($class) {

achei isso redundante e desnecessário.

 

quanto ao restante do codigo, não olhei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

dentro do autoload há um loop para incluir varios arquivos em pastas diferentes

 

function __autoload($class) {

achei isso redundante e desnecessário.

 

quanto ao restante do codigo, não olhei.

 

Bom dia, tudo bem?

O que você sugere? Muito obrigado pela dica!

Um abraço. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

1. como está a estrutura das suas pastas ?

 

librarys, plugins, models... ?

 

 

2. conhece algum framework, cakephp, zend por exemplo ?

apenas para entender como é o MVC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prove,

 

Faço que nem voce, Control, Model, View.

Estou pensando em estudar ZEND FRAMEWORK, porque usar um framework: Para nao ficar quebrando a cabeça nessas duvidas que voce tem, porque alguem ja passou por isso e ja desenvolveu no framework.

Ao mesmo tempo nao se pode ficar dependente de um framwork, voce tem que saber como funciona, estudar Patterns, modelagem, engenharia, programar nao é só sair desenvolvendo.

 

Frase: Nao a nada mais barato doque aprender com os erros dos outros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

index.php

controll

model

view

imaginei isso

 

está faltando uma estrutura melhor.

se você observar os outros frameworks entenderá.

veja como a estrutura das pastas é pareceida entre ambos

 

 

pra não complicar muito, postarei um exemplo simples de como você pode começar:

 

vamos supor que o nome do framework seja "foo"

 

uma estrutura básica seria assim:

foo/

   app/

      lib/

      model/

      template/

      config.php

      controller.php

   public_html/
              js/

              css/

              index.php

 

Dentro da pasta "app", é onde fica o MVC, de fato.

"lib" -> librarys

coloque todas as bibliotecas dentro dessa pasta.

Se você possui uma classe, por exemplo, uma classe de banco de dados, class de envio de emails, manipulações de arquvios do sistema, enfim.. bibliotecas que são utilizadas de forma geral e que sejam "obsoletas".

 

Para classes do tipo "carros.class.php"... não faz sentido jogar na pasta "lib", pois não é todos os projetos que você utilizará uma classe chamada "carros". O local adequado seria na camada "Model"

 

para isso, basta criar o modelo, exemplo

 

foo/
   app/
      model/
           cars/
           cars.php

 

cars.php é o controller do modelo "cars"

dentro da pasta cars, ficam as ações. Tudo que for referente ao controlador/modelo

 

por exemplo, vamos supor que seja um aplicativo para adicionar, editar, listar, excluir, buscar carros

 

 

foo/
   app/
      model/
           cars/
               list.php
               add.ophp
               edit.php
               delete.php
               search.php
           cars.php

 

 

entendeu +- como é ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

foo/

   app/

      lib/

      model/

      template/

      config.php

      controller.php

   public_html/
              js/

              css/

              index.php

autoload pode ser colocado no controller.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Framework é legal para aprender padrões de projetos?

sim.

pra começo é bom sim.

 

você pretende profissionalizar melhor nisso ?

 

procure também sobre controladores de versões (subversion)

 

"SVN Server"

 

Se estiver em ambiente windows, veja o programa "Tortoise SVN". É um aplicativo para gerenciar o "SVN Server".

 

Há "pouca informação" sobre esse assunto em português, portanto, pesquise em inglês para obter maiores chances de aprendizado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz, será que tudo o que estou fazendo até agora está errado então????

 

Porque eu faço assim:

 

estrutura de pastas:

public_html/
             index.php
             verCarros.php
             verUsuarios.php
             model/
                          dao/
                                       CarrosDAO.php
                                       UsuariosDAO.php
                          servlet/
                                       CarrosController.php
                                       UsuariosController.php
                          to/
                                       CarrosTO.php
                                       UsuariosTO.php
             libs/
             templates/

Agora um exemplo de cada classe:

 

UsuariosTO:

class UsuariosTO
{
             var $id = 0;
             var $user = "";
             var $pass = "";

             public function getId()
             {
                          return $this->id;
             }

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

             public function getUser()
             {
                          return $this->user;
             }

             public function setUser($user)
             {
                          $this->user = $user;
             }

             public function getPass()
             {
                          return $this->pass;
             }

             public function setPass($pass)
             {
                          $this->pass = $pass;
             }
}

UsuariosDAO:

require('../../libs/Conexao.php');
require('../to/UsuariosTO.php');

class UsuariosDAO extends UsuariosTO
{
             var $con;

             function __construct()
             {
                          $conDAO = new ConexaoDAO;
                          $this->con = $conDAO->pdo;
             }

             function Inserir() {
                          $registro = array {
                                       'user'=>$this->getUser(),
                                       'pass'=>$this->getPass()
                          };
                          $prepara = $this->con->prepare('INSERT INTO usuarios (user, pass) VALUES (:user, MD5(:pass))');
                          $execute = $prepare->execute($registro);
             }

             function Selecionar() {
                          $registros = $this->con->query('SELECT id, user, pass FROM usuarios')->fetchAll();
                          return $registros;             
             }
}

UsuariosController.php:

require('../dao/UsuariosDAO.php');

class UsuariosController
{
             function __construct() {
                          $action = $_GET['ac'];
                          switch($action) {
                                                    case 'inserir': {
                                                                              $usuario = new UsuariosDAO;
                                                                              $usuario->setUser($_POST['user']);
                                                                              $usuario->setPass($_POST['pass']);
                                                                              $msg = $usuario->Inserir() ? "Ok" : "nOk";
                                                                              echo $msg;
                                                    } break;
                          }
             }

             function Selecionar() {
                          $usuarios = new UsuariosDAO;
                          return $usuarios->Selecionar();
             }
}

new UsuariosController();

dessa maneira funciona perfeitamente... e sempre achei que estivesse certo... mas agora vendo oq vcs falaram... ta meio diferente doq eu faço...

 

Eai, estou errado nas minhas aplicações??????

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

aconselho a consertar o quanto antes.

 

mas antes, poste aqui o que você entendeu sobre o assunto e também a forma como você estava fazendo, a forma como tinha entendido, apenas pra sabermos orientá-lo de um modo prático e objetivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aconselho a consertar o quanto antes.

 

mas antes, poste aqui o que você entendeu sobre o assunto e também a forma como você estava fazendo, a forma como tinha entendido, apenas pra sabermos orientá-lo de um modo prático e objetivo.

 

Mas você viu como eu faço neh??? eu ja postei... está errado mesmo???

 

Pq vcs falam q o diretorio tem q estar fora do public_html... eu to vendo um controller ali soh...

 

como eh? ta certo fazer controller para cada tabela do banco ou faz um controller para td??

Compartilhar este post


Link para o post
Compartilhar em outros sites

como eh? ta certo fazer controller para cada tabela do banco ou faz um controller para td??

 

O grande ponto aqui é que um controlador não deve estar relacionado com uma tabela no banco de dados e sim com a requisição do usuário, quem está relacionado com banco de dados deveria ser uma Data Access onde através de Data Access Objects (não é regra) você conseguirá implementar um ORM.

 

Desse forma você pode ter 1 ou N controladores, fazendo um quote a você mesmo:

 

A lógica do MVC é assim:

 

VIEW <--- (lê interações do view) <--- CONTROLLER ---> (que por sua vez, envia/solicita os dados para o DAO) ---> MODEL (DAO)

 

Está quase lá, veja só:

 

Imagem Postada

 

Um usuário entra no seu site, mais especificamente na parte de produtos, Quando essa requisição HTTP/GET chegar à sua aplicação ela deverá ser interceptada pelo controller que irá interpretar esse GET e decidir o que fazer, muitas vezes, dependendo da complexidade da aplicação pode ser interessante ter um controlador central e sub-controladores para receber os dados tanto GET quanto POST das várias partes da aplicação. Mas o trabalho do controller é essa, receber requisições e decidir qual ação deve ser tomada.

Você pode ter uma aplicação com 1 ou N controladores sem sequer precisar de uma única conexão com banco de dados.

 

O grande deficiência do MVC é exatamente a não separação clara das regras de negócio e da camada de dados e isso acaba muitas vezes confundindo, fazendo achar que Data Access/Data Access Object são sinônimos da Model quando na verdade Data Access é uma outra camada totalmente independente.

 

*EDIT*

Quando eu falei da falta da separação da camada de acesso a dados eu estava me referindo a 5-tiers.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

O grande ponto aqui é que um controlador não deve estar relacionado com uma tabela no banco de dados e sim com a requisição do usuário, quem está relacionado com banco de dados deveria ser uma Data Access onde através de Data Access Objects (não é regra) você conseguirá implementar um ORM.

 

 

 

Mas João, vendo o exemplo de como eu faço minhas aplicações, da pra perceber que o controller é quem está decidindo o quê fazer com a ação do usuário, que logicamente, vem do view e, logo então, o controller faz a sua requisição com o DAO (que seria no model?! pelo menos sempre achei que o lugar do DAO é no model), e então o DAO manda uma resposta para o controller, que informa ao view o quê aconteceu com a requisição.

 

Então você vê que o controller está intermediando a comunicação do USUÁRIO <-> Data Access Object

 

Então se for ver, logicamente, teria que estar certo. Minha aplicação está sim, separada por camadas. O problema é que, não sei se de forma correta. Se não está correta, eu tentarei corrigir o mais rápido possível. O que me dará um pouquinho de trabalho, pois já tenho um monte de aplicações feitas nessa estrutura que eu uso como base nos projetos =/.

 

Atenciosamente,

Lucas Martins.

 

 

 

Atenciosamente,

Lucas Martins.

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.