- , так как все остальные оценивают это, одиночки не являются злом.Я даже прочитал статью «Вруны», и он использует надуманный пример немодульного дизайна и плохого наследования зависимостей.
Я думаю, вы должны рассмотреть шаблон синглтон-фабрики, где синглтон-фабрика (Auth) предоставляет метод login (), который возвращает класс User, а также методы для сохранения состояния между HTTP-запросами этого пользователя.
Это будет иметь преимущества отделения функциональности безопасности и сеанса от функциональности пользователя.Кроме того, используя фабрику, вы можете иметь несколько типов пользователей, и остальная часть системы не должна понимать, какой объект запрашивать перед проверкой БД
class auth {
private static $auth = null;
private $user = null;
// must use getAuth();
private __construct(){};
public getAuth() {
if (is_null($this->auth) {
$this->auth = new auth();
}
return $this->auth;
}
public function login($user,$pass) {
... // check db for user,
if ($dbrow->user_type == 'admin') {
$this->user = new admin_user($dbrow);
} else {
$this->user = new normal_user($dbrow);
}
$this->user->setSession($db->getsession());
}
public function getUser() {
return $this->user;
}
public function saveSession() {
// store $this->user session in db
}
public function saveUser() {
// store $this->user changes in db
}
...
}
сам пользовательский класс становится структурой данных, просто применяябизнес-правила безопасности и, возможно, форматирование некоторых данных для целей вывода.
class normal_user extends user {
... getters and setters
public function getName() {}
public function setEmail() {}
public function setprofile() {}
}
Все проблемы с БД, состоянием и безопасностью централизованы в аутентификации.единственный способ создать пользовательский объект (юридически) - это запустить auth-> login ().
вам все еще разрешено делать
$me = new normal_user();
$me->setName();
echo $me->getName();
, но для нового способа неткодер, чтобы сохранить это в БД, поскольку на него нет ссылки в $ auth-> user;
, затем вы можете создать функцию в auth для использования пользовательских объектов для создания новых пользователей (при регистрации)
...
public function create(user $user) {
// validate $user
$this->user = $user;
$this->saveUser();
}
...
вам просто нужно убедиться, что вы запускаете функции сохранения в конце выполнения ... возможно, в деструкторе ()
simple