У меня возникли проблемы с пониманием того, как сеанс работает с php через mvc. Мой код спагетти работал как шарм, и его реализация в mvc дает мне проблемы. Я могу успешно войти в систему. Проблема заключается в сохранении сеанса для зарегистрированного пользователя и отображении, например, кнопки выхода.PHP-сессия через MVC
Мое мнение Логин:
<div class="container">
<div class="login"><br>
<h4>Login</h4>
<?php
echo "<form method='POST' action='login-user.inc.php'>
<form class='login-inner'>
<input type='text' name='username' placeholder='Username' autocomplete='off' /><br /><br />
<input type='password' name='password' placeholder='Password' /><br /><br />
<input class='button' type='submit' name='submit' value='Login' />
</form>
</form>";
?>
</div>
</div>
мнение Войти проходит через логин-user.inc.php:
<?php
namespace View;
use \Controller\SessionManager;
use \Util\Util;
use \Exceptions\CustomException;
require_once 'mvc/Util/Util.php';
Util::initRequest();
$messageToUser = "";
$controller = "";
if(isset($_POST['username']) && isset($_POST['password']) && !isset($_POST[Util::USER_SESSION_NAME])){
if(!empty($_POST['username']) && !empty($_POST['password'])){
$username = htmlentities($_POST['username'], ENT_QUOTES);
$password = htmlentities($_POST['password'], ENT_QUOTES);
try{
$controller = SessionManager::getController();
$controller->loginUser($username, $password);
echo "<p class = 'positiveMessageBox'>You are logged in! :) Welcome!</p>";
}catch(CustomException $ex){
echo "<p class = 'warningMessageBox'>".$ex->getMessage()."</p>";
}catch(\mysqli_sql_exception $ex){
echo "<p class = 'negativeMessageBox'>An error in connection with database occurred! Please contact administration of this website.</p>";
}finally{
SessionManager::storeController($controller);
}
}else{
echo "<p class = 'warningMessageBox'>Both username field and password field have to be filled! Try again!</p>";
}
}
@$_GET['page'] = $_SESSION['pageId'];
include Util::VIEWS_PATH."redirect.php";
?>
Мой sessionhandler.php:
<?php
namespace Controller;
use Controller\Controller;
/**
* This class stores and retrieves session data
* @package Controller
*/
class SessionManager{
const CONTROLLER_KEY = 'controller';
const BROWSER_COMMENT_COUNT_KEY = 'browserCommentsCount';
private function __construct(){}
/**
* This method stores controller instance in the current session
* @param \Controller\Controller $controller
*/
public static function storeController(Controller $controller){
$_SESSION[self::CONTROLLER_KEY] = serialize($controller);
}
/**
* This method returns Controller instance
* If Controller instance do not exists then returns new instance
* @return \Controller\Controller
*/
public static function getController(){
if(isset($_SESSION[self::CONTROLLER_KEY]))
return unserialize($_SESSION[self::CONTROLLER_KEY]);
else
return new Controller();
}
}
?>
Мои util, который инициализируется первым и последним с помощью session_start():
<?php
namespace Util;
/**
* Utility class
* @package Util
*/
final class Util{
const VIEWS_PATH = 'src/view/';
const CSS_PATH = 'src/css/';
const IMG_PATH = 'src/img/';
const USER_SESSION_NAME = 'username';
private function __construct(){}
/**
* This method initialises autoload function and starts session
* This method should should be called first in any PHP page that receiving a HTTP request
*/
public static function initRequest(){
\session_start();
self::initAutoload();
}
private static function initAutoload(){
spl_autoload_register(function($class) {
require_once 'mvc/' . \str_replace('\\', '/', $class) . '.php';
});
}
}
?>
Это проходит через контроллер и т. Д. Это происходит после успешного входа в систему.
public function login(LoginData $userLoginData){
$userDAO = new UserDAO();
if($userDAO->doUsernameExistInDB($userLoginData->getUsername())){
if(password_verify($userLoginData->getPassword(), $userDAO->getUserPasswordFromDB($userLoginData->getUsername()))){
session_regenerate_id();
$_SESSION['username'];
}else
throw new CustomException("Password do not match with username you entered!");
}else{
throw new CustomException("We could not find the username you entered.");
}
}
И, наконец, redirect.php, который должен показать кнопку выхода из системы:.
Я задаюсь вопросом, почему сеанс не инициализируется при входе в систему он продолжает говорить мне, что я все еще может войти в систему, когда у меня уже есть. Что мне здесь не хватает?
Благодарим вас за ответ! Я думаю, что это проблема на самом деле. Я смог изменить функцию входа в $ _SESSION ['username'] = $ _POST ['username'], которая соответствует введенному имени пользователя. Интересно, как я мог бы изменить константу в классе Util. Я хочу иметь доступ к USER_SESSION_NAME с помощью $ _POST, но не могу. Есть идеи? – Einstein
Хорошо, отлично! Не стесняйтесь задавать свой вопрос так, как это разрешено, спасибо! –
Перед тем, как решить эту проблему, чтобы каждый пользователь вошел в систему, я отлаживал, установив константу «USER_SESSION_NAME» пользователю, которого я сейчас использую, войдя в систему, по-прежнему та же проблема. Я изменил имя сеанса на пользователя, которого я сейчас использую, и теперь он работает. Я думаю, что мне нужно реализовать имя сеанса с опубликованным именем пользователя. Спасибо за помощь. – Einstein