Создание экземпляра модели пользователя на основе открытого сеанса - PullRequest
1 голос
/ 20 ноября 2011

Я следую шаблону объекта доступа к данным вместе с Factory (редактировать: извините, если я делаю ошибки noob).

Чтобы войти в систему, я сейчас делаю:

$user_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->create($_POST['email'], $_POST['password']);
if ($user_dao->authenticate($user))
{
    $user_dao->login($user); // sets $_SESSION['id']
}

Мой вопрос к последующим страницам.Учитывая, что пользователь в действительности вошел в систему, как мне создать и получить доступ к экземпляру их модели User?

Чтобы получить экземпляр вошедшего в систему пользователя, я должен сделать что-то вроде следующего?

Чтобы продолжить сеанс на следующей странице, следует ли мне попробовать следующее:

$user_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->userFromSession($_SESSION['id']);
if ($user->isLoggedIn()) {
    // success
}

Мне нужно было бы делать это каждый раз, когда мне нужно что-то узнать о вошедшем в систему пользователе.

Или попробовать этот другой подход?

Или мне следует абстрагироваться от «дать мне экземпляр зарегистрированной пользовательской модели» на что-то вроде фабрики пользователя?

Например,хранить экземпляр зарегистрированного пользователя в свойстве private static класса User?

class User {
    /* ... */
    private static $_logged_in_user;

    public static function setUserLoggedIn(User $user)
    {
        self::$_logged_in_user = $user;
    }

    public static function getLoggedInUser() {
        if (!self::$_logged_in_user)
    {
        self::$_logged_in_user = new self;
    }
    return self::$_logged_in_user;
    }
    /* ... */
}
$user = User::getLoggedInUser();

Ответы [ 3 ]

0 голосов
/ 20 ноября 2011

Вы должны создать отдельный класс для авторизации, метод входа не должен принадлежать пользовательской модели. Платформа Kohana реализует это довольно хорошо - просмотрите эту ссылку, чтобы получить базовую идею: http://kohanaframework.org/3.2/guide/api/Auth.

0 голосов
/ 20 ноября 2011

Мне кажется, что пользователь DAO вам нужен только один раз: когда вы аутентифицируете пользователя и получаете его личную информацию (например, имя или роль).После этого вы можете хранить эти данные в сеансе и при каждом новом запросе восстанавливать их для ваших целей.

Что касается функции isLogged(), я предпочитаю использовать некоторую логику, инкапсулированную в классе User, вместо сохранения еще одного экземплярасамого класса User (например, private static $_logged_in_user; в вашем примере)

Итак, один экземпляр User на запрос - мой выбор.

0 голосов
/ 20 ноября 2011

Я бы инкапсулировал это в сервисный уровень, использовал только этот сервисный уровень и решал его один раз там. Затем вы можете изменить его позже, не меняя всего приложения.

...