Closed vojtech-dobes closed 12 years ago
Prvně, dáva smysl aby existovali jen 2 druhy repozitaru a to abstraktni a finalni. Jedna instance entity by ti nemela existovat v nekolika repozitarich.
Vetsinou byva lepsi mit pro nekolik druhu entity jeden spolecnej repozitar. AdminUser
NormalUser
a UsersRepository
.
Existuji ale situace kdy ale muzes mit ruzne podtypy repozitaru (kdyz to z hlediska navrhu dat dava smysl) dulezite je ale aby byli jen abstraktni a finalni.
Kdyz by dva finalni repository dedili z abtraktniho muzes udalost zaregistrovat v construktoru toho abstraktniho.
Jestli tech udalosti je hodne tak by taky mohlo jit vyseparovat jejich registracy bokem.
class ContentUpdateListenerRegistrator
{
public function register(IRepository $repo)
{
$repo->events->addListener(new SendMailToUserInMailingList(...));
$repo->events->addListener(new UpdateRss(...));
$repo->events->addListener(new InvalidatePageCache(...));
}
}
class FooRepository
{
public function __construct($orm)
{
parent::__construct($orm);
$registerer = $orm->getContext()->getService('contentUpdateListenerRegistrator, 'ContentUpdateListenerRegistrator');
$registerer->register($this);
}
}
Je ale potreba davat pozor aby se pak udalosti nestali moc neprehledne. Resp. muzou hodne menit funkcnost repositaru a mapperu a je dobre kdyz je hned videt jake udalosti tento repositar/mapper pouziva.
Nejsem si úplně jistý, jaký by zde měla být best-practice... na Uličníkovi je využito dědičnosti entit, takže jednotlivé typy obsahu dědí od entity Post. Poděděné typy mají vlastní repozitáře. Když chci ovšem zaregistrovat listener pro všechny typy obsahu, musím listener zaregistrovat na každém z poděděných repozitářů.
Nemohlo by v tomto ORM nějak pomoct? Je to žádoucí v ORMu :) ?