2016-09-28 2 views
2

У меня возникли проблемы с пониманием того, как сеанс работает с 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, который должен показать кнопку выхода из системы:.

Я задаюсь вопросом, почему сеанс не инициализируется при входе в систему он продолжает говорить мне, что я все еще может войти в систему, когда у меня уже есть. Что мне здесь не хватает?

ответ

0

В вашей функции входа вы, кажется, просто вызываете $_SESSION['username'].

Нельзя ли повлиять на это имя пользователя подключенного пользователя?

Затем в вашем redirect.php, когда вы проверяете \Util\Util::USER_SESSION_NAME, который соответствует username, он должен быть пустым, а затем всегда отображается кнопка «Войти».

Надеюсь, это поможет!

+0

Благодарим вас за ответ! Я думаю, что это проблема на самом деле. Я смог изменить функцию входа в $ _SESSION ['username'] = $ _POST ['username'], которая соответствует введенному имени пользователя. Интересно, как я мог бы изменить константу в классе Util. Я хочу иметь доступ к USER_SESSION_NAME с помощью $ _POST, но не могу. Есть идеи? – Einstein

+0

Хорошо, отлично! Не стесняйтесь задавать свой вопрос так, как это разрешено, спасибо! –

+0

Перед тем, как решить эту проблему, чтобы каждый пользователь вошел в систему, я отлаживал, установив константу «USER_SESSION_NAME» пользователю, которого я сейчас использую, войдя в систему, по-прежнему та же проблема. Я изменил имя сеанса на пользователя, которого я сейчас использую, и теперь он работает. Я думаю, что мне нужно реализовать имя сеанса с опубликованным именем пользователя. Спасибо за помощь. – Einstein

Смежные вопросы