Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Crud com DAO e MVC

Estou tentando fazer um CRUD usando MVC e DAO mas não sei se essa seria a forma correta e também como chamaria o método insere do ProdutoController.

<?php

class Database {

    private $host = "localhost";
    private $username = "root";
    private $password = "123456";
    private $database = "crud";


    public function conecta() {
        $conexao = new mysqli($this->host, $this->username, $this->password, $this->database);
        return $conexao;
    }

}


<?php 

class Produto {

    private $id;
    private $nome;
    private $descricao;
    private $preco;

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

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

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

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getDescricao() {
        return $this->descricao;
    }

    public function setDescricao($descricao) {
        $this->descricao = $descricao;
    }

    public function getPreco() {
        return $this->preco;
    }

    public function setPreco($preco) {
        $this->preco = $preco;
    }

}


<?php  

class ProdutoDAO {

    function adiciona(Database $conexao, Produto $produto) {

        $query = "INSERT INTO produtos (nome, descricao, preco) VALUES ('{$produto->getNome()}', '{$produto->getDescricao()}', '{$produto->getPreco()}')";    
        mysqli_query($conexao->conecta(), $query);
    }

}


<?php  
require_once ('../models/Produto.php');
require_once ('../models/ProdutoDAO.php');
require_once ('../config/Database.php');

class ProdutoController {

    public function insere() {
        $nome = $_POST['nome'];
        $descricao = $_POST['descricao'];
        $preco = $_POST['preco'];

        $conexao = new Database();

        $produto = new Produto();
        $produto->setNome($nome);
        $produto->setPreco($preco);
        $produto->setDescricao($descricao);

        $produtoDao = new ProdutoDao();
        $produtoDao->adiciona($conexao, $produto);
    }

}


<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="../../public/css/bootstrap.min.css" rel="stylesheet">
    <title>Adiciona Produto</title>
</head>
<body>
<div class="container">
    <h3>Adicionar Produto</h3>
    <form method="post" action="../../controllers/ProdutoController.php">
      <div class="form-group">
        <label>Nome</label>
        <input type="text" class="form-control" name="nome">
      </div>
      <div class="form-group">
        <label>Descrição</label>
        <input type="text" class="form-control" name="descricao">
      </div>
      <div class="form-group">
        <label>Preço</label>
        <input type="text" class="form-control" name="preco">
      </div>
      <button type="submit" class="btn btn-primary">Adicionar</button>
    </form>
</div>
</body>
</html>
6 respostas

Ola Marcelo,

penso que o seu código é totalmente viável.

Alem de usar o nome insere para o método no ProdutoController outros nomes possíveis seriam: adiciona ou store.

Att,

Acho que me expressei mal, mas o chamar que falei seria como invoco o metodo no formulario? Daria certo de passar os dados do form para esse produto controller se nao fosse uma classe, apenas um arquivo php normal, mas creio que não seria a forma correta de fazer. Não sei como poderia passar esses dados do form para o metodo insere do ProdutoController.

Alguém poderia ajudar em relação a isso?

Esse tutorial pode te ajudar a entender melhor como fazer

http://www.w3programmers.com/crud-with-php-oop-and-mvc-design-pattern/

A ideia dele é a seguinte, no arquivo de controller (no seu caso, o ProdutoController), você teria uma função para cada método (inserir, novo registro, atualizar, listar, editar, ou outra ações relacionadas).

Cada função teria além da programação correspondente o include para inserir a view, ou seja, o PHP que você deseja ver na tela.

O que o tutorial mostra é que você precisa de um "handler", ou seja, uma função que deve ser executada sempre que o controlador for chamado. De acordo com algum parâmetro enviado (no caso do tutorial, via GET), essa função redireciona para algum método de sua classe, para executar a ação correspondente.

Mantenha seu formulário do jeito que está e no seu ProdutosController.php faça assim:

<?php  
require_once ('../models/Produto.php');
require_once ('../models/ProdutoDAO.php');
require_once ('../config/Database.php');

class ProdutoController {

    public function insere() {
        $nome = $_POST['nome'];
        $descricao = $_POST['descricao'];
        $preco = $_POST['preco'];

        $conexao = new Database();

        $produto = new Produto();
        $produto->setNome($nome);
        $produto->setPreco($preco);
        $produto->setDescricao($descricao);

        $produtoDao = new ProdutoDao();
        $produtoDao->adiciona($conexao, $produto);
    }

}

$controller = new ProdutoController();
$controller->insere();

Resolveu ???

solução!

Consegui fazer com o código abaixo:

<?php  

require_once ('../models/Produto.php');
require_once ('../models/ProdutoDAO.php');
require_once ('../config/Database.php');


if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['method'])) { // aqui é onde vai decorrer a chamada se houver um *request* POST
    $method = $_POST['method'];
    if(method_exists('ProdutoController', $method)) {
        $product = new ProdutoController;
        $product->$method($_POST);
    } else {
        echo 'Metodo incorreto';
    }
}



class ProdutoController{

    function insere() {
        $nome = $_POST['nome'];
        $descricao = $_POST['descricao'];
        $preco = $_POST['preco'];
        $conexao = new Database();
        $produto = new Produto();
        $produto->setNome($nome);
        $produto->setPreco($preco);
        $produto->setDescricao($descricao);
        $produtoDao = new ProdutoDao();
        $produtoDao->adiciona($conexao, $produto);

    }

}


<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="../../public/css/bootstrap.min.css" rel="stylesheet">
    <title>Adiciona Produto</title>
</head>
<body>

<div class="container">
    <h3>Adicionar Produto</h3>
    <form method="post" action="../../controllers/ProdutoController.php">
    <input type="hidden" name="method" value="insere">
      <div class="form-group">
        <label>Nome</label>
        <input type="text" class="form-control" name="nome">
      </div>
      <div class="form-group">
        <label>Descrição</label>
        <input type="text" class="form-control" name="descricao">
      </div>
      <div class="form-group">
        <label>Preço</label>
        <input type="text" class="form-control" name="preco">
      </div>
      <button type="submit" class="btn btn-primary">Adicionar</button>
    </form>
</div>
</body>
</html>