Начитался паттерна Data-Mapper.
У меня в программе есть классы, представляющие сущности системы вроде Пользователь (содержит ссылку на Аккаунт), АккаунтПользователя, Сервисы (содержат ссылку на аккаунт)
class objectUser {
private $fio = null;
private $role = null;
private $username = null;
private $password = null;
private $salt = null;
private $hash = null;
private $account = null;
private $services = Array();
public function getFio() {
return $this->fio;
}
public function setFio($_fio) {
if (!validator::nameRuEn100($_fio)) {
AppLogger::instance()->warning("objectUser::setFio() попытка установить невалидное имя", $_fio);
return false;
}
$this->fio = $_fio;
return true;
}
public function setAccount(objectAccount $_account) {
if ($_account->is_complete() === true) {
$this->account = $_account;
return true;
}
AppLogger::instance()->warning("попытка установить незаконченный аккаунт", $_account);
return false;
}
public function getAccount() {
return $this->account;
}
// и еще куча геттеров-сеттеров
// вызываем перед сохранением в базу
public function is_complete() {
if ( ($this->fio == null) ||
($this->role == null) ||
($this->username == null) ||
($this->password == null) ||
($this->salt == null) )
return false;
return true;
}
// Вызываем для сохранения в базу объектом userMapper
public function getMongoStruct() {
$obj = Array();
$obj['fio'] = $this->getFio();
$obj['role'] = $this->getRole();
$obj['username'] = $this->getUsername();
$obj['password'] = $this->getPassword();
$obj['salt'] = $this->getSalt();
$obj['enabled'] = $this->getEnabled();
$obj['hash'] = $this->getHash();
if ($this->getAccount() != null)
$obj['account'] = $this->getAccount()->getMongoId();
else
$obj['account'] = null;
return $obj;;
}
}
И так в каждом классе. И еще столько же классов Мапперов. Код-то по сути одинаковый.
И у меня возникает ощущение, что я делаю чужую работу. Что всё это делается какой-нибудь простой библиотекой или небольшим фреймворком.
Что я просто могу просто задекларировать какие поля есть в объекте который нужно сохранить, какого они должны быть типа, длины, какой валидатор им применять и методы геттеры/сеттеры/is_complete появятся сами.
А как вы решаете вопрос хранения объектов в ваших суперских (или не очень) приложениях?