Evo jedna situacija:
imam klasu Activity. Klasa Album je one-2-many sa Activity klasom. Activity je many-2-many sa User klasom. Ideja je da kad se kreira novi Album, odredjeni korisnici budu obavesteni o tome; skraceno, tabela Activity_User je dobiti novi red; activity_id cilja na activity, user_id koji je user obavesten. Klasika.
U Doctrine 1.2 je to sledeci kod:
Code (php):
// klasa Album
public function preInsert($event)
{
/**
* Create new activity when inserting so fans can see it
*/
$activity = new Activity() ;
$activity->type = Activity::NEW_ALBUM ;
foreach ($this->Creator->MyFans as $user)
$activity->NotifiedUsers[] = $user ;
$this->Activities[] = $activity ;
parent::preInsert($event) ;
}
// klasa Album
public function preInsert($event)
{
/**
* Create new activity when inserting so fans can see it
*/
$activity = new Activity() ;
$activity->type = Activity::NEW_ALBUM ;
foreach ($this->Creator->MyFans as $user)
$activity->NotifiedUsers[] = $user ;
$this->Activities[] = $activity ;
parent::preInsert($event) ;
}
Ovo je SAV kod potreban u preInsert() metodi i prilicno je jednostavan. Doctrine se sam brine o relacijama. foreach petlja ce od kreatora albuma (Creator je alias za User-a koji je kreirao Album) izvuci listu fanova i njima poslati obavestenje. Sve se ovo snima kroz jednu transakciju i jako lepo radi.
E sad problem;
kako to uraditi preko Doctrine 2.0? Jednostavno ne mogu da nadjem nacin da lako uradim ovako nesto a da to ne zahteva daleko vise koda.
Problem 2, DQL:
U 1.2 verziji, DQL je boza za koristiti:
Code (php):
return $this->createQuery('o')
->select('o.*, m.value AS value')
->leftJoin('o.WordTranslation m WITH m.translation_id=?', Translation::getForVisitor()->id)
->execute() ;
return $this->createQuery('o')
->select('o.*, m.value AS value')
->leftJoin('o.WordTranslation m WITH m.translation_id=?', Translation::getForVisitor()->id)
->execute() ;
Parametri se lako prosledjuju. Doctrine 2.0:
Code (php):
$query = $em->createQuery('SELECT u from ForumUser u WHERE (u.username = :name OR u.username = :name2) AND u.id = :id');
$query->setParameters(array(
':name' => 'Bob',
':name2' => 'Alice',
':id' => 321,
));
$query = $em->createQuery('SELECT u from ForumUser u WHERE (u.username = :name OR u.username = :name2) AND u.id = :id');
$query->setParameters(array(
':name' => 'Bob',
':name2' => 'Alice',
':id' => 321,
));
Meni ovo bas i nema previse razlike u odnosu na obicni PDO i manje je citljiv nego prvi primer.
Problem 3, validacija:
Prema ovom clanku , Doctrine 2.0 nema validaciju kao sto je ima Doctrine 1.2. Jasno mi je za custom validate pravila, ali ona najobicnija; regexp za polje, da li je u nekom range-u itd. je daleko lakse uraditi u staroj verziji:
Code (php):
$this->hasColumn('title', 'string', 255, array(
'type' => 'string' ,
'regexp' => '/^[a-zA-Z0-9žŽđĐšŠćĆčČÁÉÍÓÚÑÜ áéíóúñüÄäÖöÜüß\-,\._]{4,255}$/' )) ;
$this->hasColumn('title', 'string', 255, array(
'type' => 'string' ,
'regexp' => '/^[a-zA-Z0-9žŽđĐšŠćĆčČÁÉÍÓÚÑÜ áéíóúñüÄäÖöÜüß\-,\._]{4,255}$/' )) ;
Da li ovo znaci da za ovako jednostavne stvari moram uvek da kreiram posebne metode? I kako da koristim isValid() kako bi kontroler znao da je objekat validan ili ne, tj. ili da ga snimi ili opet posalje template-u?
Problem 4, deep validacija:
Ova slika pokazuje validaciju klase Translation uz leftJoin svih Word objekata. Kod je standardno jednostavan; if ($translation->isValid()) ce mi dati odgovor da li su SVI pridruzeni objekti takodje validni. Ako jesu, $translation->save() ce opet kroz transakciju da snimi izmenjene Word-ove (Doctrine ne snima neizmenjene). Opet, vrlo, vrlo jednostavno za koriscnenje.
Kako to uraditi u Doctrine 2.0 a da ne moram da koristim neki framework?