Должен ли я и как сохранить свой объект User в сеансе? - PullRequest
4 голосов
/ 03 августа 2011

Вот базовая структура моего класса User:

class User {

private $_userId = NULL;
private $_isAuthenticated = FALSE;
private $_code = NULL;
private $_pageLoads = 1;
private $_dbh = NULL;
const SECRET = 'shhhh its a secret';
const PAGE_LOADS = 5;
const HALF_SECOND_MS = 500000;

function __construct( PDO $dbh ) {
    $this->_dbh = $dbh;
}

public function login( $username, $password ) {}

public function isAuthenticated() {}

private function _authenticate( $username, $password ) {}

private function _challenge() {}

private function _generateCode() {}

private function _protectedVars() {}

function __sleep() {}

function __wakeup() {}

public function save() {
    return serialize( $this );
}
}

ОПИСАНИЕ ЧТО Я ПЫТАЮСЬ ДЕЛАТЬ

Я уже довольно давновремя использования PHP встроенных в MySQL функций.Я решил для этого проекта, что я буду следовать более ООП подходу и перейду на PDO.Когда я использовал для создания «безопасной» среды, у меня была форма входа в систему, проверяйте, существует ли пользователь (с правильным паролем), а затем сохраняйте идентификатор пользователя в переменной сеанса (скажем: $ _SESSION ['user_id']) ивуаля.В моем безопасном окружении.Я бы просто проверил, был ли установлен user_id, и дал бы им доступ.

Теперь я знаю, что это не очень хороший подход, и я знаю, что приведенный выше код, вероятно, будет иметь свои собственные проблемы (которые, я надеюсь,вы, ребята, дадите мне ад за это в образовательных целях).По сути, моя идея состояла в том, чтобы создать объект User, в который я бы передавал свой объект PDO в конструкторе.От этого пользователя я мог войти в систему, и как только все выполнение было выполнено, я бы сохранил пользователя в переменной сеанса путем сериализации класса.Как только будет загружена новая страница, будет вызвана функция пробуждения, и я вызову данные, которые не были сериализованы, чтобы убедиться, что они не были подделаны, и в этом случае я выйду из системы, отключив флаг isAuthenticated (это код выше).

ВОПРОС

Когда я пытаюсь сериализовать объект, я получаю ошибку, сообщающую, что объекты PDO не могут быть сериализованы.Я провел небольшое исследование и понял, что мне нужно реализовать метод __sleep и вернуть массив переменных, которые я хотел бы сохранить.Однако когда я просыпаюсь, как мне повторно инициализировать объект PDO внутри объекта пользователя?Есть ли метод, где я могу добавить аргументы в функцию unserialize, которая передаст его моей функции __wakeup?Я совершенно не на том пути и мне нужно переосмыслить это?

1 Ответ

0 голосов
/ 03 августа 2011

Вы должны иметь возможность получить объект PDO из чего-то вроде MyApp::getConnection() и вызвать его из вашего метода __wakeup

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...