Próxima etapa: Criando e validando usuários
Para pensarmos em criar e validar os usuários, podemos pensar em:
- Usuário comum – aquele que vai fazer a compra, vai fazer a troca, precisa fazer um cadastro, um login de acesso.
- 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);
}
}



