Начитался паттерна 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 появятся сами.
А как вы решаете вопрос хранения объектов в ваших суперских (или не очень) приложениях?







