ako zabespecit transakciu nad viacerimi modelmi?
- duskohu
- Člen | 778
Caute, Ako riesite zabespecenie transakcie ked pracujete nad viacerimi modelmi? Napr. ked mam presenter, alebo control, a potrebujem pracovat s viacerimi modelmi, ale aby to bolo trasnakcne, kedze kazdy model je samostatne.
$productEntity = $this->productRepository->add($values);
$this->productItemRepository->add($productEntity->id, $productItems);
$this->productImageRepository->add($productEntity->id, $productImage);
Editoval duskohu (2. 3. 2013 13:48)
- castamir
- Člen | 629
Je to otázka návrhu aplikace. Popíši zde, jak to řeším já, nicméně není to dogma. Můžeš si najít své řešení, které ti bude lépe vyhovovat.
U mě je model obecně nějaká vrstva pro správu dat. V rámci modelu rozlišuji několik úrovní abstrakce.
- mapper – vrstva pro praci s daty (databáze, xml, apod). Jednotlivé typy mapperů (např. pro databázi) mají stejné rozhraní.
- repository – vrstva pro práci nad skupinou dat (např databázová tabulka). Používá mapper pro zajištění operací, ale jeho vnitřní implementace ho nezajímá. Je vůči repository skrytá.
- facade (fasáda) – vrstva, která zajišťuje aplikační logiku. Přistupuje k různým repository a zpracovává data. Zde nejčastěji používám rozhraní pro transakce.
Presenter pak zpracovává data poskytnutá z fasád…
Editoval castamir (2. 3. 2013 14:08)
- Nox
- Člen | 378
Ok, tak to asi řeší co jsi napsal (ale pokud je mapper xml, tak se asi transakce neuplatní … nepočítá tu tedy ta fasáda s určitou implementací? Nebo to chápu špatně?).
Pokud by ta fasáda používala zas jinou část modelu … myslim, že už se tu „vnořené“ transakce taky řešily (dle implementace i counterem … pokud vim tak třeba MySQL bohužel vnořené transakce nepodporuje)