TransWikia.com

Entendimento sobre MVC

Stack Overflow em Português Asked by Carlos Rocha on December 11, 2021

Estou tentando entender o padrão MVC mas são tantos vídeos de forma diferente na web que bagunça o entendimento.

Eu, por minha vez, estou usando um padrão próprio. Mas gostaria de saber se está correto, senão, qual seria a forma própria.

Estou usando em 2 camadas de classes e uma em uma arquivo separado.

Exemplo:

Tabela: Clientes

MVC/Model/Clientes.php

class Clientes {
 $id;
 $nome;
 $idade;
 public function __construct() {}
/**
  Getteres e Setteres
**/
}

MVC/View/Clientes.php

class Clientes {
 public function __construct() {}
/**
  métodos de gravação,alteração e leitura no banco
**/
}

MVC/Controller/Clientes.php

require_once '../Controller/Clientes';
require_once '../Model/Clientes';

$clientes = new Clientes();
$clientesLista = $clientes->listaClientes();

index.php

require_once "MVC/Controller/Clientes.php";

A ideia é essa mesma? Ou estou totalmente por fora?

Se não for está a ideia, podem por favor postar um exemplo bem simples igual ao que eu postei. De preferencia usando termos conhecidos como class Clientes e evite por favor exemplos como Class foo, foo->bar.

2 Answers

Você acaba de descobrir o mundo maravilhoso do treinamento na web (e algum fora dela), principalmente, mas não limitado, aos gratuitos. Muita desinformação sendo passada pra frente, pouco questionamento e critério. Quando quem aprende não entende o que está ocorrendo ali, não pode avaliar se é certo e está cada diz mais assim, em tudo na vida. A desinformação impera e quem não tem uma base muito boa para classificar a qualidade geral fica perdido mesmo.

O que importa é atender bem sua necessidade. Dizer que fez MVC só por dizer e isto não ser a melhor solução não ajuda em nada.

Dá para fazer MVC sem usar classes. Nunca viu alguém mostrando assim? Porque provavelmente todos que viu ensinando esse padrão não sabem disso. Eles ensinam algo que não entendem. Mas tem exceções, claro, pode ser apenas que seja a abordagem daquele momento que a pessoa está passando. Mas como saberemos?

O MVC não tem aplicação universal e muitos casos só traz burocracia sem vir junto alguma vantagem. Na verdade grande parte do que eu vejo por aí não precisa de controller, e ele está ali de enfeite. De fato isto é tão óbvio que alguns frameworks passaram oferecer alternativas, como o Razor Pages no .NET.

Nos casos onde ele é útil não deveria ter uma implementação obrigatoriamente certa, apenas uma adequada ao contexto.

Seu dois primeiros código parecem repetidos e boa parte deles desnecessários, embora não dê para afirmar porque está cheio de comentário e nada de código.

Getters e setters são necessários ali? Eles te dão alguma vantagem? Em scripts não costuma dar. Se sua aplicação não é um script provavelmente não deveria usar uma linguagem de script para fazê-lo.

A view deve ter apresentação e mais nada. Ali parece que vai colocar coisas que deveria estar no modelo, deveria estar no modelo ou em um serviço auxiliar.

O controlador parece ter começado direito, não sei se continuará, mas seu código não indica isto.

O exemplo não lhe ensinará nada útil porque será só mais uma receita de bolo que pode ou não ser adequado ao seu problema, que não está bem definido para poder dizer algo. No contexto usar Clientes ou Foo dá na mesma. Na verdade Clientes pode ser pior porque pode passar a impressão que ali tem algo prático, útil, quando na verdade não é. Quase sempre exemplo sem fundamentos prejudicam o entendimento, e este é um dos problemas do vídeos, tutoriais e pseudo cursos, além é claro, de livros caça-níqueis. Só se aprende quando começa do começo.

Aqui tem algumas informações, mas de forma muito organizada. Se ler tudo, seguir os links, consultar a bibliografia passada, pode se preparar para o MVC. Mas antes seria bom entender outros aspectos da computação e do pensamento. Tem alguns casos de falhas e buracos e até mesmo as minhas respostas não são lá tão boas assim. Alguns links (não assino em baixo de alguns):

Answered by Maniero on December 11, 2021

A camada Model é aonde ficam todo o "Modelo de Negócios" da sua aplicação. Isso inclui também métodos de gravação,alteração e leitura no banco.

A camada Controller é uma ponte, o acesso inicial do usuário antes de acessar a View e o Model.


Estrutura exemplo:

  • MVC/Model/
    • Clientes.php
    • ClientesDAO.php
  • MVC/View/
    • ClientesView.php
  • MVC/Controller/
    • ClientesController.php
  • index.php

index.php

require_once "MVC/Controller/ClientesController.php";
new ClientesController();

MVC/Controller/ClientesController.php

require_once '../Model/Clientes';
require_once '../Model/ClientesDAO';
require_once '../View/ClientesView';

class ClientesController {

    public function __construct() {

        ClienteDAO cli = new ClienteDAO();
        $listagemDeClientes = cli -> listar();

        $view = new ClientesView();
        $view->exibir($listagemDeClientes);
    }

}

MVC/Model/ClientesDAO.php

class ClientesDAO {

    public function __construct() {

    }

    public function listar(){
        /// conectar com o banco
        // gerar a lista
        $arrayClientes = [

            new Clientes("Nome1", "Sobrenome1"),
            new Clientes("Nome2", "Sobrenome2")

        ];

        return $arrayClientes;

    }

}

MVC/Model/Clientes.php

class Clientes {

    private $nome, $sobrenome;

    public function __construct($nome, $sobrenome) {
        $this->nome = $nome;
        $this->sobrenome = $sobrenome;
    }

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

    public function getSobrenome(){
        return $this->sobrenome;
    }

}

MVC/View/ClientesView.php

class ClientesView {

    public function __construct() {

    }

    public function exibir($lista){

        foreach($lista as $clientes){
            $conteudo = file_get_contents("../htm/template1.php");
            $conteudo = str_replace("{nome}", $clientes->getNome);
            $conteudo = str_replace("{sobrenome}", $clientes->getSobrenome);
            echo $conteudo;
        }

    }

}

htm/template1.php

<h1>{nome}</h1>
<p>{sobrenome}</p>

Você pode implementar mais de 1 Controller se precisar. Mas repare que o Controller apenas identifica a requisição e "conversa" com o restante da aplicação. Todo o modelo de negócios está dentro da camada model.

Answered by Andrei Coelho on December 11, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP