Olá. Há alguns anos na faculdade tive uma aula prática de padrões com PhP, e uma delas foi o MVC. Aprendi com meu professor o padrão MVC, mas não sei até hoje o mesmo foi ensinado da maneira correta. Sempre que vejo projetos com padrões MVC estão um pouco diferentes do meu, na verdade, a classe Controller parece não fazer muito sentido no que eu aprendi.
Gostaria que dessem uma olhada na forma que eu programo em MVC e dizer se estou fazendo da maneira correta ou se teria como melhorar, pois realmente estou perdido, principalmente na parte da Controller e da Model.
Na Model:
class ModelProduto{ private $id; private $descricao; private $valor;public __construct(){ // nada por aqui no momento… }protected function inserirProduto($produto){
// realiza conexão com o banco
// executa query no banco passando valores $produto->id, $produto->descricao, $produto->valor// retorna boolean se foi inserido com sucesso no banco ou nao return $resultado;}
protected function buscarTodosProdutos(){ // realiza conexão com o banco // traz os registros e armazenam em algum lugar, no caso, num array $produtos = new Array(); foreach(resultado in lista){ $produto = new Produto(); $produto->id = resultado[‘id’]; $produto->descricao = resultado[‘descricao’]; $produto->valor = resultado[‘valor’]; $produtos[] = $produto; } return $produtos; }// metodos Get e metodos Set em visibilidade public…
}
Feito isso, na Controller que é onde eu tenho mais dúvida, aprendi a estruturá-la da seguinte forma:
class Produto extends ModelProduto{
// as vezes aqui um método ou outro (geralmente static) para montar um objeto ou fazer algo extra // sempre tenho a função de montar objetos para ser usada mais tarde public static criaObj($descricao, $valor){ $produto = new Produto(); $produto->setDescricao($descricao); $produto->setValor($valor); return $produto; }public function inserirProduto($produto){ return parent::inserirProduto() }public function buscarTodosProdutos(){ return parent::buscarTodosProdutos() } }
Uma vez estruturado este MVC, na View, caso eu tenha um formulário para cadastrar este produto, ou exibí-lo, eu faço o seguinte:
<html>
<header></header>
<body>
<form method=“POST” action=“manipulaProduto.php”>
<!-- formulário aqui -->
</form>
</body>
</html>
Consequentemente eu crio outro arquivo em outra pasta chamado manipula, onde eu verifico os dados dos formulários e mando pra controller, mais ou menos assim:
if(isset($_POST[‘formularioEnviado’])){
inserir();
}
function inserir(){
//crio variaveis para pgar os $_POST e validar os campos,
//verificar se não existem nulos, poucos caracteres etc
$validado = validarCampos();
if($validado){ // se passar pelas validações, chamo o inserir do Controller $inserido = inserirProduto();if($inserido){ // envio alguma modal para a view informando que tudo foi validado com sucesso e demais eventos se necessário return $inserido; }}
// envio alguma modal para a view informando erro no formulario se não entrar no if
return $erros;}
function validarCampos(){
// valida os campos e retorna para a função acima
}
function inserirProduto(){
// chamo o Controller e crio um objeto $produto = Produto->criaObj($_POST[“descricao”], $_POST[“valor”]) $resposta = $produto->inserirProduto($produto); return $resposta; }
Esse é o padrão que eu utilizo em meus projeto. Não foi tudo que aprendi na faculdade, a maior parte eu desenvolvi minha maneira própria de programar, mas a questão é o padrão MVC. As vezes acho que esse manipulaProduto.php faz o papel que o Controller deveria fazer, pois o controller nada mais faz que transferir uma função para a Model, o que chega a ser quase inutil ao meu ver.
Podem me dizer como anda essa minha estrutura, se algo poderia ser melhorado ou se o padrão MVC está realmente errado? Lembrando que essa estrutura que criei aqui para apresentar meu problema é algo extremamente resumido e não cheguei a rodar os códigos, mas esta é a forma que programo atualmente.
Obrigado!