Doctrine 2 a Eventy uvnitř entity

fordo.pytlik
Člen | 26
+
+1
-

Ahoj,

trochu experimentuju s Doctrinou a Eventy, hodně jsem o tom přečetl (teda snad), ale pořád mi asi unikají některé základní věci. Celé se to pokusím demonstrovat na příkladu, který si asi každý dokáže představit – chceme vytvořit objednávkový systém.

Hezký příklad o tom napsal třeba Filip Procházka: Eventy a Nette framework (@FilipProcházka) . Ale tato ukázka předpokládá, že objednávku bude dokončovat pouze třída OrderProcess – ale co, když bych ji omylem uzavřel pomocí např. $order->complete() – tj. bez toho procesoru? Z mého pohledu tenhle přístup vede k anémickému modelu, protože tu akci najednou bude provádět nějaké servisní třída… (ale raději mě nechytejte za slovo, třeba se pletu).

Tak nějak si představuju, že by se objednávka v měla uzavřít pouze pomocí $order->complete(), tedy ta entita. Což samozřejmě není nemožné – líbí se mi myšlenka od @Tharos a jeho RPG (z diskuze: Závislost jednoho modelu na jiných), kde se event vystřelí přímo na entitě. (fakt mi to přijde podstatně přirozenější). Problém mi přijde v tom, že zde je ItemEventsInitializer, který opět ví o všech věcech, které se mají provést po tom, co se provede prodej.

První co mě napadne je použít Kdyby\Events a ItemEventsInitializer by mohl pouze předat event dál. Ale v takovém případě by jakýkoliv listener musel naslouchat právě na ItemEventsInitializeru nikoliv na samotné entitě – a to mi přijde zase škoda… (další prostor k chybě)

Máte nějaký nápad, jak to vyřešit?

Aby bylo zřejmé, čeho se snažím dosáhnout – snažím se vytvořit (a hlavně pochopit) robustní návrh aplikace, která se mi nerozbije pod rukama, když ji budu za půl roku měnit, protože jsem na něco zapomněl. Snažím se, aby ta objednávka prostě nešla použít špatně.

Samozřejmě by šlo říct, že tím, že si zahrávám s ItemEventInitializerem – tak na něj mohu snadno zapomenout, vytvořit entitu ručně a už mám na problém zaděláno… zatím to řeším tak, že entita vyžaduje EventInitializator v konstruktoru. Zkouším to i na jiných entitách, které v daném kontextu třeba nejdou vytvořit ručně.

Jan Mikeš
Člen | 771
+
+2
-

Ahoj @fordo.pytlik to co pravděpodobně hledáš, jsou doménové eventy – eventy „dispatchujes“ přímo v entitě.

Pro inspiraci koukni třeba na https://beberlei.de/…nevents.html