контроллер вида модели — ошибка навигационного меню PHP и MVC — меню не изменяется при входе в систему, но при обновлении

В настоящее время я работаю над сайд-проектом для веб-приложения. Я использую PHP и пытаюсь следовать шаблону типа MVC (не используя никаких фреймворков), и я не могу заставить меню в моей панели навигации отображаться правильно. Предполагаемая функция заключается в том, что пользователь попадет на сайт и войдет со своей информацией. Каждый пользователь имеет уровень разрешений, который определяет вид навигационных меню, к которым он имеет доступ.

У меня сейчас работает сайт, когда пользователь входит в систему, он помещает свое имя пользователя и уровень разрешений в глобальную переменную $ _SESSION. Макет по умолчанию (layout.php), отвечающий за отображение навигации, затем переносится на страницу через require_once, после того как он проверяет, какой тип меню навигации следует использовать. Для всех целей настройка работает, только не так, как я хочу. После входа в систему меню навигации остается прежним до тех пор, пока страница не обновится или не будет выбрана опция меню.

Я пытался отследить проблему, но будучи новее для PHP и еще новее для MVC, я не могу понять, где можно решить проблему. Я знаю, что layout.php рендерит каждый раз, когда контроллер выбирает представление. Каким-то образом роль в глобальном $ _SESSION должна быть установлена ​​до этого рендеринга, но после завершения контроллера входа в систему. Я пытался обновлять страницы с помощью PHP и JavaScript, но это постоянное обновление (постоянно повторяется), и хотя это было бы быстрым решением, оно не кажется правильным. Надеясь, что кто-то может подумать о чем-то, чего у меня нет, или указать мне правильное направление. Вот фрагменты кода для кода, который используется во время процесса входа в систему.

index.php — это «фронт» сайта, откуда все начинается и куда попадает пользователь.

if (isset($_SESSION["username"]) && array_key_exists("username", $_SESSION)) {
session_destroy();
} else {
session_start();
}

require_once('connection.php');

if (isset($_GET['controller'])) {
$controller = $_GET['controller'];

if (isset($_GET['action'])) {
$action = $_GET['action'];
} else {
$action = 'index';
}
} else {
$controller = 'login';
$action = 'login';
}

require_once('views/layout.php');

layout.php

<?php
$nav = "";
if (isset($_SESSION['username']) && array_key_exists("username", $_SESSION)) {
if ($_SESSION['role'] == 1) {
$nav = "admin_nav.php";
} else if ($_SESSION['role'] == 2) {
$nav = "prof_nav.php";
} else if ($_SESSION['role'] == 3) {
$nav = "student_nav.php";
} else {
$nav = "guest_nav.php";
}
} else {
$nav = "default_nav.php";
}
?>

<!DOCTYPE html>
<html>
<head>
<title>Auto-Grader</title>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="styles/site.css">
</head>

<body>
<div id="header">
<div id="header-top">
</div>
<div id="header-bottom">
</div>
</div>

<div id="navigation-wrapper">
<?php require_once($nav); ?>
</div>

<div id="content-wrapper">
<?php require_once('routes.php'); ?>
</div>

<footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</footer>
</body>
</html>

Контроллер входа

class LoginController {
public function login() {
require_once('views/login/index.php');
}

public function validateLogin() {
require_once('models/login_validator.php');

$email = $_POST['email'];
$password = $_POST['password'];

$isValid = LoginValidator::validateLogin($email, $password);

$username = $isValid['username'];

if ($isValid) {
# Show home/landing page view
require_once('views/home/index.php');
} else {
require_once('views/login/failure.php');
}
}

public function logout() {
unset($_SESSION['username']);
unset($_SESSION['role']);
session_destroy();
# Redirect to homepage on logout
echo "<script> window.location.assign('index.php') </script>";
}
}

Модель входа в систему (где глобальная переменная $ _SESSION установлена ​​впервые)

class LoginValidator {

public static function validateLogin($email, $password) {
$db = Db::getInstance();

$userQuery = $db->prepare('SELECT * FROM users WHERE email = :email AND pwd = :password');
$userQuery->execute(array('email' => $email, 'password' => $password));

$user = $userQuery->fetch(PDO::FETCH_ASSOC);

if (!$user) {
return false;
} else {
$_SESSION['username'] = $user['username'];
$_SESSION['role'] = $user['perm_id'];
return true;
}
}
}

Цените любой вклад, если есть другие части, которые нужно увидеть, я был бы рад отредактировать сообщение и предоставить их.

0

Решение

Вы должны отслеживать выполнение через ваше приложение. Если переменная сеанса установлена ​​после создания навигации, она не будет работать. Если это так, вам нужно обработать все события после публикации, прежде чем создавать представление.

У вас есть ошибка в следующем коде:

if (isset($_SESSION["username"]) && array_key_exists("username", $_SESSION)) {
session_destroy();
} else {
session_start();
}

session_start заселяет $_SESSION супер глобальный, поэтому первое условное выражение никогда не вернет true.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]