Předávání instance Entity přes Container

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VojtaSim
Člen | 55
+
0
-

Zdravím,
nedávno jsem začal používat Lean Mapper a s výhodami, které poskytující entity mi začalo vrtat hlavou jak by se dala předávat daná Entita do modelů atd.
Entitu vytvářím v BasePresenteru::startup() a obsahuje data potřebné jak v presenterech dědicích od BasePresenteru tak i v některých modelech/Repositářích. Potřebná data = např. id zmiňované entity podle kterého vybírám další seznamy v repositářích.

$neededEntity = $this->someRepository->get($id);
$this->context->addService('neededEntity', $neededEntity);

Teď otázka:
Je dobré v presenterech, ve kterých injectuju model/Repositář (který potřebuje tu entitu) zavolat vlastní metodu, která mi předá potřebnou entitu (ať už z ->context->getService('neededEntity') nebo z BasePresenter->needeEntity)?
Nebo je lepší mít tu entitu uloženou jen v BasePresenteru->neededEntity a při každém volání metody z modelu/Repositáře předávat požadované data z entity + další věci?

greeny
Člen | 405
+
0
-

Jestli je zaručeno, že ta entita je jen jedna, tak bych udělal service, která tu entitu má jako singleton a ve startupu by se zinicializovala.

Filip Procházka
Moderator | 4668
+
0
-

Udělej obálku která bude entitu poskytovat, rozhodně neregistruj entitu jako službu.

Tharos
Člen | 1030
+
0
-

+1 @Filip


Dále, pokud používáš Lean Mapper, bych si dal záležet, aby se do takové služby zabalila entita, která má co „nejčistší kontext“. Jinými slovy taková, která byla vytažena z databáze jako jediná v rámci daného dotazu. V praxi třeba pomocí $repository->find($id).

Osobně bych nepoužil entitu, ke které jsem se nějakým způsobem dotraverzoval, načetl ji v rámci nějakého $repository->findAll() atp.

VojtaSim
Člen | 55
+
0
-

Tharos napsal(a):

Jinými slovy taková, která byla vytažena z databáze jako jediná v rámci daného dotazu.

Entita je single vytvořená pomocí ->createEntity()

Filip Procházka napsal(a):

Udělej obálku která bude entitu poskytovat, rozhodně neregistruj entitu jako službu.

s obálkou není problém, spíš že s ->addService('neededEntity', $neededEntity); jdu jak s křížkem po funuse, protože všechny ->injcect() už proběhly a musel bych v každém presenteru manuálně předávat entitu do každého modelu/repositáře, který ji vyžaduje.