PetrP / Orm

http://orm.petrprochazka.com
15 stars 2 forks source link

Registrace listeneru u poděděných repozitářů #35

Closed vojtech-dobes closed 12 years ago

vojtech-dobes commented 12 years ago

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 :) ?

PetrP commented 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.

PetrP commented 12 years ago

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.