Validando o usuário
Para validar um usuário que será cadastrado ou logado na plataforma, vamos pensar em como a gente entra numa rede social: temos que preencher o usuário e uma senha. Logo, pensamos dessa forma.
<?php
namespace App\Controllers;
use App\Models\UsuarioModel;
class UsuarioController {
private $model;
private $twig;
/* Construtor da classe
* Recebe o objeto PDO e o objeto Twig como parâmetros
* Inicializa o modelo de usuário e o objeto Twig
* O objeto PDO é usado para interagir com o banco de dados
* O objeto Twig é usado para renderizar templates
* O modelo de usuário é responsável por realizar operações relacionadas a usuários no banco de dados
*/
public function __construct($twig, $pdo) {
if (session_status() === PHP_SESSION_NONE) {
session_start(); // Inicia a sessão apenas se ainda não estiver iniciada
}
$this->model = new UsuarioModel($pdo);
$this->twig = $twig;
}
/* Método para redirecionar o usuário */
private function redirecionar(){
$referer = '/sebo/public/usuarios' ?? $_SERVER['HTTP_REFERER'];
header("Location: $referer");
exit;
}
/* Método para renderizar a página de usuários */
private function render($url){
return $this->twig->render($url, [
'usuarios' => $this->model->listarTodos()
]);
}
/* Método para exibir a página inicial de usuários */
public function index() {
if (!isset($_SESSION['usuario'])) {
header('Location: /sebo/public/login'); // Redireciona para a página de login
exit;
}
$usuarioLogado = $_SESSION['usuario'];
echo $this->twig->render('index.twig', [
'usuario_logado' => $usuarioLogado
]);
}
/* Método para exibir o formulário de cadastro de usuários */
public function cadastrar() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$dados = [
'nome' => $_POST['nome'] ?? null,
'email' => $_POST['email'] ?? null,
'senha' => $_POST['senha'] ?? null
];
if (!$dados['nome'] || !$dados['email'] || !$dados['senha']) {
echo $this->twig->render('/cadastro.twig', [
'error' => 'Todos os campos são obrigatórios.'
]);
return;
}
$dados['senha'] = password_hash($dados['senha'], PASSWORD_DEFAULT);
try {
$this->model->salvar($dados);
header('Location: /sebo/public/usuarios');
exit;
} catch (\Exception $e) {
echo $this->twig->render('/cadastro.twig', [
'error' => 'Erro ao cadastrar usuário: ' . $e->getMessage()
]);
}
} else {
echo $this->twig->render('/cadastro.twig');
}
}
/* Método para exibir o formulário de edição de usuários */
public function editar($id) {
$usuario = $this->model->buscarPorId($id);
if ($usuario) {
echo $this->twig->render('usuarios/editar.twig', [
'usuario' => $usuario
]);
} else {
echo "Usuário não encontrado.";
}
}
/* Método para salvar os dados do usuário */
public function salvar($data) {
if ($this->model->salvar($data)) {
$this->redirecionar();
} else {
echo "Erro ao salvar o usuário.";
}
}
/* Método para excluir um usuário */
public function excluir($id) {
if ($this->model->deletar($id)) {
$this->redirecionar();
} else {
echo "Erro ao excluir o usuário.";
}
}
/* Método para exibir a página de login */
public function login() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? null;
$senha = $_POST['senha'] ?? null;
if ($this->autenticar($email, $senha)) {
$this->index(); // Chama index após autenticação
return;
} else {
echo $this->twig->render('/login.twig', [
'error' => 'E-mail ou senha inválidos.'
]);
}
} else {
echo $this->twig->render('/login.twig');
}
}
/* Método para fazer logout do usuário */
public function logout() {
session_destroy(); // Apenas destrói a sessão, sem chamar session_start()
$this->redirecionar();
}
/* Método para verificar se o usuário está autenticado */
public function verificarAutenticacao() {
return isset($_SESSION['usuario']);
}
/* Método para obter o usuário autenticado */
public function obterUsuarioAutenticado() {
return $_SESSION['usuario'] ?? null;
}
/* Método para verificar se o usuário tem permissão */
public function verificarPermissao($nivelPermissaoNecessario) {
$usuario = $this->obterUsuarioAutenticado();
return $usuario && $usuario['tipo'] >= $nivelPermissaoNecessario;
}
/* Método para autenticar o usuário */
public function autenticar($email, $senha) {
$usuario = $this->model->buscarPorEmail($email);
if ($usuario && $this->model->validarSenha($email, $senha)) {
$_SESSION['usuario'] = [
'id' => $usuario['id'],
'nome' => $usuario['nome'],
'email' => $usuario['email'],
'tipo' => $usuario['tipo']
];
return true;
}
return false;
}
}
Por fim, devemos pensar no view do Usuário num espaço onde ele tenha o acesso a interface e fazer suas edições. E tudo isso sem ainda fazer a separação do usuário do admin.



