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

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.

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