В настоящее время я работаю над сайд-проектом для веб-приложения. Я использую 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;
}
}
}
Цените любой вклад, если есть другие части, которые нужно увидеть, я был бы рад отредактировать сообщение и предоставить их.
Вы должны отслеживать выполнение через ваше приложение. Если переменная сеанса установлена после создания навигации, она не будет работать. Если это так, вам нужно обработать все события после публикации, прежде чем создавать представление.
У вас есть ошибка в следующем коде:
if (isset($_SESSION["username"]) && array_key_exists("username", $_SESSION)) {
session_destroy();
} else {
session_start();
}
session_start
заселяет $_SESSION
супер глобальный, поэтому первое условное выражение никогда не вернет true.
Других решений пока нет …