Projeto da Sebo Online: unindo MVC, PHP, Banco de Dados e Git

Próxima etapa: Criando e validando usuários

Para pensarmos em criar e validar os usuários, podemos pensar em:

  1. Usuário comum – aquele que vai fazer a compra, vai fazer a troca, precisa fazer um cadastro, um login de acesso.
  2. Usuário administrador – aquele que será o responsável pelo acervo do sebo, que vai fazer o cadastro de produtos, dos tipos, controle de estoque…

Outra que coisa que faremos é pensar no Usuário como uma entidade, logo, ele terá uma tabela no banco de dados e um MVC dedicado. E quais são os atributos? O nome do usuário, o e-mail e a senha (que vamos validar, para iniciar a sessão).

Vamos olhar com carinho o Model do Usuário: ela precisa ter a função de criar, ler, alterar e excluir os dados. Esta é uma versão básica, onde tenho a criação e verificação do e-mail.

<?php

namespace App\Models;
use PDO;

class UsuarioModel {
    private $db;
    
    public function __construct($database) {
        $this->db = $database;
        $this->criarTabelaSeNaoExistir();
    }

    /* Cria a tabela de usuários se não existir.
    * A tabela contém os seguintes campos:
    * - id: inteiro, auto incremento, chave primária
    * - nome: string, não nulo
    * - email: string, não nulo, único
    * - senha: string, não nulo
    * - tipo: enum, padrão 'usuario'
    * - data_criacao: datetime, padrão CURRENT_TIMESTAMP
    */
    private function criarTabelaSeNaoExistir() {
        $query = "
        CREATE TABLE IF NOT EXISTS usuarios (
            id INT AUTO_INCREMENT PRIMARY KEY,
            nome VARCHAR(100) NOT NULL,
            email VARCHAR(100) UNIQUE NOT NULL,
            senha VARCHAR(255) NOT NULL,
            tipo ENUM('admin', 'usuario') DEFAULT 'usuario',
            data_criacao DATETIME DEFAULT CURRENT_TIMESTAMP
        )
        ";
        $this->db->exec($query);
    }

    /* Salvar o usuário, seja criando ou atualizando.
    * Enviar um array de dados com os campos 'id', 'nome', 'email' e 'senha'.
    * Se o 'id' estiver presente, atualiza o usuário existente.
    * Caso contrário, cria um novo usuário.
    */
    public function salvar($data = null) {
        if ($data['id']) {
            return $this->atualizar($data['id'], $data['nome'], $data['email'], $data['senha']);
        }
        return $this->criar($data['nome'], $data['email'], $data['senha']);
    }

    private function criar($nome, $email, $senha) {
        $query = "INSERT INTO usuarios (nome, email, senha) VALUES (?, ?, ?)";
        $stmt = $this->db->prepare($query);
        return $stmt->execute([$nome, $email, $senha]);
    }

    private function atualizar($id, $nome, $email, $senha = null) {
        if ($senha) {
            $query = "UPDATE usuarios SET nome = ?, email = ?, senha = ? WHERE id = ?";
            $params = [$nome, $email, $senha, $id];
        } else {
            $query = "UPDATE usuarios SET nome = ?, email = ? WHERE id = ?";
            $params = [$nome, $email, $id];
        }
        $stmt = $this->db->prepare($query);
        return $stmt->execute($params);
    }

    /* Buscar um usuário por ID, email ou nome.
    * Retorna um único usuário se encontrado.
    * Caso contrário, retorna null.
    */
    public function buscarUsuario($data) {
        if (isset($data['id'])) {
            return $this->buscarPorId($data['id']);
        } elseif (isset($data['email'])) {
            return $this->buscarPorEmail($data['email']);
        } elseif (isset($data['nome'])) {
            return $this->buscarPorNome($data['nome']);
        }
        return null;
    }
    /* Buscar múltiplos usuários por nome ou email.
    * Retorna um array de usuários se encontrados.
    * Caso contrário, retorna um array vazio.
    */
    public function buscarUsuarios($data) {
        if (isset($data['nome'])) {
            return $this->buscarPorNome($data['nome']);
        } elseif (isset($data['email'])) {
            return $this->buscarPorEmail($data['email']);
        }
        return [];
    }
    /* Buscar um usuário por email.
    * Retorna um único usuário se encontrado.
    * Caso contrário, retorna null.
    */
    public function buscarPorEmail($email) {
        return $this->buscarUnico("SELECT id, nome, email, tipo  FROM usuarios WHERE email = ?", [$email]);
    }

    public function buscarPorNome($nome) {
        return $this->buscarMultiplos("SELECT id, nome, email, tipo  FROM usuarios WHERE nome LIKE ?", ['%' . $nome . '%']);
    }

    public function buscarPorNomeOuEmail($termo) {
        return $this->buscarMultiplos(
            "SELECT id, nome, email, tipo  FROM usuarios WHERE nome LIKE ? OR email LIKE ?",
            ['%' . $termo . '%', '%' . $termo . '%']
        );
    }

    /* Validar a senha do usuário.
    * Recebe o email e a senha.
    * Retorna true se a senha estiver correta.
    * Caso contrário, retorna false.
    */
    public function validarSenha($email, $senha) {
        $usuario = $this->buscarPorEmail($email); // Busca o usuário pelo email
        if (!$usuario || !isset($usuario['senha'])) {
            var_dump($usuario);
            return false; // Retorna falso se o usuário ou a senha não existirem
        }
        return password_verify($senha, $usuario['senha']); // Verifica a senha
    }

    /* Listar usuários com limite e offset.
    * Recebe o limite e o offset como parâmetros.
    * Retorna um array de usuários.
    */
    public function listar($limite = 10, $offset = 0) {
        $query = "SELECT id, nome, email, tipo FROM usuarios LIMIT ? OFFSET ?";
        $stmt = $this->db->prepare($query);
        $stmt->bindParam(1, $limite, PDO::PARAM_INT);
        $stmt->bindParam(2, $offset, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function contar() {
        return $this->db->query("SELECT COUNT(*) FROM usuarios")->fetchColumn();
    }

    public function listarTodos() {
        return $this->buscarMultiplos("SELECT id, nome, email, tipo FROM usuarios");
    }

    public function buscarPorId($id) {
        return $this->buscarUnico("SELECT id, nome, email, tipo FROM usuarios WHERE id = ?", [$id]);
    }

    public function deletar($id) {
        $stmt = $this->db->prepare("DELETE FROM usuarios WHERE id = ?");
        return $stmt->execute([$id]);
    }

    private function buscarUnico($query, $params = []) {
        $stmt = $this->db->prepare($query);
        $stmt->execute($params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    private function buscarMultiplos($query, $params = []) {
        $stmt = $this->db->prepare($query);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

Páginas: 1 2 3 4

· ·

últimas aulas

confira mais [ -> ]

Descubra mais sobre Apprendendo

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continuar lendo

Descubra mais sobre Apprendendo

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continuar lendo