LAB-8

Padrão MVC2

O que é MVC?

MVC (Model-View-Controller) é um padrão de arquitetura de software que separa uma aplicação em três componentes principais:

  • Model (Modelo): Representa a lógica de dados da aplicação. Ele gerencia o comportamento e os dados do aplicativo e responde a solicitações para alterar o estado (geralmente de um controlador).
  • View (Visão): É responsável por apresentar os dados ao usuário e formatar sua representação. Ele só exibe informações recebidas do modelo e envia interações de usuário para o controlador.
  • Controller (Controlador): Atua como um intermediário entre o modelo e a visão. Ele ouve as entradas de usuário e transforma essas entradas em comandos para o modelo ou visão.

Por que usar o MVC?

  • Separação de Preocupações: Cada componente (Modelo, Visão e Controlador) tem uma responsabilidade bem definida, o que facilita a manutenção e evolução da aplicação.
  • Reutilização e Flexibilidade de Código: Com a lógica de negócios separada da interface de usuário, os modelos podem ser reutilizados em diferentes partes da aplicação ou em outras aplicações.
  • Facilita Testes e Depuração: Como a lógica de dados e a interface de usuário estão desacopladas, fica mais fácil realizar testes unitários e depurar o código.
  • Melhoria na Organização do Projeto: Ajuda na organização do projeto, tornando-o mais compreensível e fácil de gerenciar.
  • Suporte a Múltiplas Interfaces de Usuário: Diferentes visões podem ser criadas para apresentar os mesmos dados, permitindo, por exemplo, adaptar a interface para dispositivos móveis sem alterar a lógica do aplicativo.

Em resumo, o MVC ajuda a tornar o desenvolvimento de software mais estruturado, flexível e adaptável a mudanças.

Novo Projeto

1. Estrutura do Projeto

Diretórios Principais:

  • /classes: Armazena classes de entidades como Veiculo e Proprietario.
  • /controllers: Contém lógicas de controle.
  • /models: Gerencia interações com o banco de dados.
  • /views: Arquivos HTML/PHP para interface do usuário.
  • /config: Armazena arquivos de configuração, como database.php.

Estrutura Exemplo:

/projeto_veiculos

/classes

    • veiculo.php
    • proprietario.php

/controllers

    • veiculoController.php
    • proprietarioController.php

/models

    • veiculoModel.php
    • proprietarioModel.php

/views

    • veiculosViews.php
    • editarVeiculos.php
    • proprietariosViews.php
    • editarProprietarios.php

/config

    • database.php

index.php

2. Banco de Dados

Esquema do Banco:

  • veiculos: id, marca, modelo, ano, proprietario_id
  • proprietarios: id, nome, endereco
				
					CREATE TABLE proprietarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100),
    endereco VARCHAR(150)
);

CREATE TABLE veiculos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    marca VARCHAR(50),
    modelo VARCHAR(50),
    ano INT,
    proprietario_id INT,
    FOREIGN KEY (proprietario_id) REFERENCES proprietarios(id)
);
				
			

3. Arquivos PHP

/classes/Veiculo.php

				
					<?php

class Veiculo {
    private $id;
    private $marca;
    private $modelo;
    private $ano;
    private $proprietario_id;

    // Getters e setters
    public function getId() {
        return $this->id;
    }

    public function getMarca() {
        return $this->marca;
    }

    public function setMarca($marca) {
        $this->marca = $marca;
    }

    public function getModelo() {
        return $this->modelo;
    }

    public function setModelo($modelo) {
        $this->modelo = $modelo;
    }

    public function getAno() {
        return $this->ano;
    }

    public function setAno($ano) {
        $this->ano = $ano;
    }

    public function getProprietarioId() {
        return $this->proprietario_id;
    }

    public function setProprietarioId($proprietario_id) {
        $this->proprietario_id = $proprietario_id;
    }
}

?>
				
			

/classes/Proprietario.php

				
					<?php

class Proprietario {
    private $id;
    private $nome;
    private $endereco;

    // Getters e setters
    public function getId() {
        return $this->id;
    }

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

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

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }
}

?>
				
			

/controllers/veiculoController.php

				
					<?php

require_once '../models/VeiculoModel.php';

class VeiculoController {
    private $model;

    public function __construct() {
        $this->model = new VeiculoModel();
    }

    public function create($marca, $modelo, $ano, $proprietario_id) {
        return $this->model->create($marca, $modelo, $ano, $proprietario_id);
    }

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

    public function update($id, $marca, $modelo, $ano) {
        return $this->model->update($id, $marca, $modelo, $ano);
    }

    public function delete($id) {
        return $this->model->delete($id);
    }
    
    public function getAll() {
       return $this->model->getAll();
    }
}

?>
				
			

/controllers/proprietarioController.php

				
					<?php

require_once '../models/ProprietarioModel.php';

class ProprietarioController {
    private $model;

    public function __construct() {
        $this->model = new ProprietarioModel();
    }

    public function create($nome, $endereco) {
        return $this->model->create($nome, $endereco);
    }

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

    public function update($id, $nome, $endereco) {
        return $this->model->update($id, $nome, $endereco);
    }

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

    public function getAll() {
        return $this->model->getAll();
    }
}

?>
				
			

/models/VeiculoModel.php

				
					<?php

require_once '../config/database.php';

class VeiculoModel {
    private $pdo;

    public function __construct() {
        $this->pdo = Database::getConnection();
    }

    public function create($marca, $modelo, $ano, $proprietario_id) {
    $sql = "INSERT INTO veiculos (marca, modelo, ano, proprietario_id) VALUES (:marca, :modelo, :ano, :proprietario_id)";
    $stmt = $this->pdo->prepare($sql);
    $stmt->bindParam(':marca', $marca);
    $stmt->bindParam(':modelo', $modelo);
    $stmt->bindParam(':ano', $ano);
    $stmt->bindParam(':proprietario_id', $proprietario_id);
    $stmt->execute(); 
    return $this->pdo->lastInsertId();
    }

    public function read($id) {
        $sql = "SELECT * FROM veiculos WHERE id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$id]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    public function update($id, $marca, $modelo, $ano) {
        $sql = "UPDATE veiculos SET marca=?, modelo=?, ano=? WHERE id=?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([$marca, $modelo, $ano, $id]);
    }

    public function delete($id) {
        $sql = "DELETE FROM veiculos WHERE id=?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([$id]);
    }

    public function getAll() {
       $sql = "SELECT * FROM veiculos";
       $stmt = $this->pdo->query($sql);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

?>
				
			

/models/ProprietarioModel.php

				
					<?php

require_once '../config/database.php';

class ProprietarioModel {
    private $pdo;

    public function __construct() {
        $this->pdo = Database::getConnection();
    }
       
    public function create($nome, $endereco) {
        $sql = "INSERT INTO proprietarios (nome, endereco) VALUES (:nome, :endereco)";
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindParam(':nome', $nome);
        $stmt->bindParam(':endereco', $endereco);
        $stmt->execute();
        return $this->pdo->lastInsertId();
    }

    public function read($id) {
        $sql = "SELECT * FROM proprietarios WHERE id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$id]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    public function update($id, $nome, $endereco) {
        $sql = "UPDATE proprietarios SET nome=?, endereco=? WHERE id=?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([$nome, $endereco, $id]);
    }

    public function delete($id) {
        $sql = "DELETE FROM proprietarios WHERE id=?";
        $stmt = $this->pdo->prepare($sql);
        return $stmt->execute([$id]);
    }
 
    public function getAll() {
        $sql = "SELECT * FROM proprietarios";
        $stmt = $this->pdo->query($sql);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

?>
				
			

/views/veiculos.php

				
					<?php
require_once '../controllers/veiculoController.php';
$controller = new VeiculoController();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['delete'])) {
        $controller->delete($_POST['id']);
    } elseif (isset($_POST['create'])) {
        $controller->create(
            $_POST['marca'],
            $_POST['modelo'],
            $_POST['ano'],
            $_POST['proprietario_id']
        );
    }
}

$veiculos = $controller->getAll();
?>

<!DOCTYPE html>
<html>
<head>
    <title>Veículos</title>
</head>
<body>
    <a href="../index.php">Inicio</a>
    <h1>Veículos</h1>
    <form method="post">
        <input type="text" name="marca" placeholder="Marca" required>
        <input type="text" name="modelo" placeholder="Modelo" required>
        <input type="number" name="ano" placeholder="Ano" required>
        <input type="number" name="proprietario_id" placeholder="ID do Proprietário" required>
        <button type="submit" name="create">Adicionar Veículo</button>
    </form>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Marca</th>
                <th>Modelo</th>
                <th>Ano</th>
                <th>Proprietário ID</th>
                <th>Ações</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($veiculos as $veiculo): ?>
                <tr>
                    <td><?= htmlspecialchars($veiculo['id']) ?></td>
                    <td><?= htmlspecialchars($veiculo['marca']) ?></td>
                    <td><?= htmlspecialchars($veiculo['modelo']) ?></td>
                    <td><?= htmlspecialchars($veiculo['ano']) ?></td>
                    <td><?= htmlspecialchars($veiculo['proprietario_id']) ?></td>
                    <td>
                        <form method="post" style="display:inline-block;">
                            <input type="hidden" name="id" value="<?= htmlspecialchars($veiculo['id']) ?>">
                            <button type="submit" name="delete">Excluir</button>
                        </form>
                        <form action="editarVeiculos.php" method="get" style="display:inline-block;">
                            <input type="hidden" name="id" value="<?= htmlspecialchars($veiculo['id']) ?>">
                            <button type="submit">Editar</button>
                        </form>
                    </td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</body>
</html>
				
			

/views/editarVeiculos.php

				
					<?php
require_once '../controllers/veiculoController.php';
$controller = new VeiculoController();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['update'])) {
        $controller->update($_POST['id'], $_POST['marca'], $_POST['modelo'], $_POST['ano']);
        header('Location: veiculos.php');
        exit;
    }
}

$veiculo = null;
if (isset($_GET['id'])) {
    $veiculo = $controller->read($_GET['id']);
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Editar Veículo</title>
</head>
<body>
    <h1>Editar Veículo</h1>
    <?php if ($veiculo): ?>
    <form method="post">
        <input type="hidden" name="id" value="<?= htmlspecialchars($veiculo['id']) ?>">
        <input type="text" name="marca" value="<?= htmlspecialchars($veiculo['marca']) ?>" required>
        <input type="text" name="modelo" value="<?= htmlspecialchars($veiculo['modelo']) ?>" required>
        <input type="number" name="ano" value="<?= htmlspecialchars($veiculo['ano']) ?>" required>
        <button type="submit" name="update">Salvar Alterações</button>
    </form>
    <?php else: ?>
        <p>Veículo não encontrado.</p>
    <?php endif; ?>
    <a href="veiculos.php">Voltar</a>
</body>
</html>
				
			

/views/proprietarios.php

				
					<?php
require_once '../controllers/proprietarioController.php';
$controller = new ProprietarioController();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['delete'])) {
        $controller->delete($_POST['id']);
    } elseif (isset($_POST['create'])) {
        $controller->create(
            $_POST['nome'],
            $_POST['endereco'],
        );
    }
}

$proprietarios = $controller->getAll();
?>

<!DOCTYPE html>
<html>
<head>
    <title>Proprietários</title>
</head>
<body>
    <a href="../index.php">Inicio</a>
    <h1>Proprietários</h1>
    <form method="post">
        <input type="text" name="nome" placeholder="Nome" required>
        <input type="text" name="endereco" placeholder="Endereço" required>
        <button type="submit" name="create">Adicionar Proprietário</button>
    </form>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Nome</th>
                <th>Endereço</th>
                <th>Ações</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($proprietarios as $proprietario): ?>
                <tr>
                    <td><?= htmlspecialchars($proprietario['id']) ?></td>
                    <td><?= htmlspecialchars($proprietario['nome']) ?></td>
                    <td><?= htmlspecialchars($proprietario['endereco']) ?></td>
                    <td>
                        <form method="post" style="display:inline-block;">
                            <input type="hidden" name="id" value="<?= htmlspecialchars($proprietario['id']) ?>">
                            <button type="submit" name="delete">Excluir</button>
                        </form>
                        <form action="editarProprietarios.php" method="get" style="display:inline-block;">
                            <input type="hidden" name="id" value="<?= htmlspecialchars($proprietario['id']) ?>">
                            <button type="submit">Editar</button>
                        </form>
                    </td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</body>
</html>
				
			

/views/editarProprietarios.php

				
					<?php
require_once '../controllers/proprietarioController.php';
$controller = new ProprietarioController();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['update'])) {
        $controller->update($_POST['id'], $_POST['nome'], $_POST['endereco']);
        header('Location: proprietarios.php');
        exit;
    }
}

$proprietario = null;
if (isset($_GET['id'])) {
    $proprietario = $controller->read($_GET['id']);
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Editar Proprietário</title>
</head>
<body>
    <h1>Editar Proprietário</h1>
    <?php if ($proprietario): ?>
    <form method="post">
        <input type="hidden" name="id" value="<?= htmlspecialchars($proprietario['id']) ?>">
        <input type="text" name="nome" value="<?= htmlspecialchars($proprietario['nome']) ?>" required>
        <input type="text" name="endereco" value="<?= htmlspecialchars($proprietario['endereco']) ?>" required>
        <button type="submit" name="update">Salvar Alterações</button>
    </form>
    <?php else: ?>
        <p>Proprietário não encontrado.</p>
    <?php endif; ?>
    <a href="proprietarios.php">Voltar</a>
</body>
</html>
				
			

/config/database.php

				
					<?php

class Database {
    private static $pdo;

    public static function getConnection() {
        if (!self::$pdo) {
            $dsn = 'mysql:host=localhost;dbname=gerenciador_veiculos';
            $username = 'root';
            $password = '';

            try {
                self::$pdo = new PDO($dsn, $username, $password);
                self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                die('Conexão falhou: ' . $e->getMessage());
            }
        }
        return self::$pdo;
    }
}

?>
				
			

index.php

				
					<!DOCTYPE html>
<html>
<head>
    <title>Gerenciador de Veículos</title>
</head>
<body>
    <h1>Bem-vindo ao Gerenciador de Veículos</h1>
    <p>Escolha uma opção abaixo:</p>
    <ul>
        <li><a href="/veiculo/views/veiculos.php">Cadastrar Veículo</a></li>
        <li><a href="/veiculo/views/proprietarios.php">Cadastrar Proprietário</a></li>
    </ul>
</body>
</html>
				
			

Essa estrutura cria um esqueleto básico de um aplicativo PHP usando o padrão MVC, permitindo manipulações básicas de veículos e proprietários através de uma interface web simples. Certifique-se de substituir as chamadas de métodos e gerenciamento de sessão conforme necessário para suas necessidades específicas.

Implementação do MVC no Projeto

Estrutura e Motivo

Model (Modelo):

  • Responsabilidade: Gerencia a lógica de dados e interações com o banco de dados.
  • Implementação: Clases VeiculoModel e ProprietarioModel contêm métodos CRUD para acessar e manipular dados.

View (Visão):

  • Responsabilidade: Apresenta dados ao usuário e lida com a interface.
  • Implementação: Arquivos de visualização veiculos.php e proprietarios.php exibem listas, formulários e ações dos usuários.

Controller (Controlador):

  • Responsabilidade: Media a interação entre Model e View, processa inputs e atualiza o modelo.
  • Implementação: Controladores VeiculoController e ProprietarioController gerenciam lógica de controle.

Por que usar MVC?

  • Separação de Preocupações: Cada camada tem uma responsabilidade clara, o que facilita manutenção e escalabilidade.
  • Reutilização e Flexibilidade: Isola a lógica de dados, permitindo que diferentes visões possam ser aplicadas sem alterar os modelos.
  • Facilitação de Testes: Permite testar componentes individualmente e melhora a depuração.

Fluxo de Trabalho MVC

1. Usuário Interage com a View:

  • Arquivo: veiculos.php ou proprietarios.php
  • Ação: O usuário pode adicionar, editar ou excluir registros.

2. A View Envia Solicitações ao Controller:

  • Adicionar:
    • Arquivo: veiculos.php ou proprietarios.php
    • Processo: Formulário envia dados ao controller via POST.
  • Editar/Excluir:
    • Editar: Redireciona para editarVeiculo.php ou editarProprietario.php.
    • Excluir: Envia solicitação de exclusão ao controller.

3. O Controller Processa a Solicitação:

  • Adicionar/Editar:
    • Arquivo: VeiculoController.php ou ProprietarioController.php
    • Processo: Valida e processa os dados, atualizando o modelo.
  • Excluir:
    • Processo: Deleta o registro usando o modelo apropriado.

4. O Model Executa a Lógica de Dados:

    • Arquivo: VeiculoModel.php ou ProprietarioModel.php
    • Processo: Executa operações CRUD no banco de dados.

5. A View Atualiza para o Usuário:

  • Adicionar:
    • Arquivo: veiculos.php ou proprietarios.php
    • Processo: Lista é atualizada com o novo registro.
  • Editar:
    • Arquivo: editarVeiculo.php ou editarProprietario.php
    • Processo: Após a edição, redireciona de volta à página inicial.
  • Excluir:
    • Arquivo: veiculos.php ou proprietarios.php
    • Processo: Remove o registro visualmente após a exclusão.