Ukládání entit pomocí NotORM

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
czm4rty
Člen | 29
+
0
-

Snažím alespoň zhruba dodržet model Entity-Repository-(Mapper). Měl bych otázku ke způsobu ukládání Entit. Napadly mě dva způsoby. První spočívá v napsání metody save() pro repositář každé entity zvlášť.

Article.php
class Article {
	private $id;
	private $title;

	public function getTitle() {
		return $this->title;
	}
	public function setTitle($title) {
		$this->title = $title;
	}
	...
}
ArticleRepository.php
function save() {
	$this->database->article()->insert(array(
		'id' => $this->id,
		'title' => $this->title
	));
}

Což je tedy hodně psaní. V druhé způsobu (nevím jestli úplně správný) vložím nad každou properties v entitě anotaci @Column, které následně v repozitáři vytáhnu a uložím.

Repository.php
function save($entity) {
        $ref = new \Nette\Reflection\ClassType($entity);
        $properties = $ref->getProperties();
        $vals = array();
        foreach($properties as $item) {
            if($item->hasAnnotation('Column')) {
                $vals[$item->name] = $entity->{$item->name};
            }
        }

	return $this->database->article()->insert($vals);
}
  1. Je druhů způsob použitelný?
  2. Mám vložený záznam vracet jako objekt Article (tedy nastavit všechny properties ve třídě Article a tu poté vrátit)?
  3. Při získávání záznam z databáze v presenteru ($articleRepository->find($id)) mám opět vytvořit objekt Article a ten poté vrátit?

Předem díky za pomoc

studna
Člen | 181
+
0
-

Já bych jen řekl, že pokud se snažíš NotORM používat jako ORM, tak nic není správně. :)

Jinak obecně – metoda save u repository, které předáš entitu, je správně. A ke 2. a 3. otázce – vracíš entity.

Nox
Člen | 378
+
0
-

Je možné postavit ORM nad NotORM … stejně jako by šlo nad PDO, dibi nebo čímkoli jiným.

Psát zvláštní Repository pro každý typ entity by se mi teda nechtělo, zvlášť, když budou defakto stejné … na druhou stranu se pak musí psát ty column. Nebo nemusí, šlo by třeba mít implements MyEntity, a mít nějakou funkci jako getPersitedColumns, podobně jako je filosofie metody sleep: http://cz2.php.net/…p5.magic.php#…