LeanMapper & DI: EntityFactory dostane závislost na Nette\Security\User příliš brzy
- Pavel Janda
- Člen | 977
Resolved
Prosímvás, kdo používáte LeanMapper, nechápu jednu věc:
V konfiguáku zarigistruji EntityFactory a jakoukoliv jinou službu:
services:
- EntityFactory
- FooService
extensions:
- LeanMapperExtension # Tracy panel
A teď, když si vyžádám v konstruktoru EntityFactory instanci
Nette\Security\User
, dostanu usera, ale ještě jako guesta, bez
identity. Kdežto když si usera vyžádám ve službě FooService, dostanu už
správně přihlášeného uživatele. Máte s tím někdo nějakou
zkušenost?
Editoval Pavel Janda (9. 12. 2015 10:06)
- Pavel Janda
- Člen | 977
Rozuzlení: Teprve v BasePresenteru si nastavuji UserStorage namespace a k tomu dochází dřív než sestavení DIC, školácká chyba.
Editoval Pavel Janda (9. 12. 2015 12:50)
- Felix
- Nette Core | 1270
Pavel Janda napsal(a):
Rozuzlení: Teprve v BasePresenteru se nastavuje UserStorage namespace a k tomu dochází dřív než sestavení DIC, školácká chyba.
Myslis to tak, ze v BasePresenteru si sam nastavujes
UserStorage
, ano? Abychom predesli tomu, ze to nekdo bude hledat
v API Presenteru.
- Pavel Janda
- Člen | 977
@Felix Ano, tak je to myšleno, odpověď upravena.
@CZechBoY Ano, pomocí Kdyby\Events
. Metoda
BasePresenter::checkRequirments
mi vyvolá událost
::onCheckRequirments($this, $this->user)
. Tu si odchytím a na
předané závislosti daného listeneru
zavolám
->setUser($user)
.
Editoval Pavel Janda (9. 12. 2015 12:51)
- Pavel Janda
- Člen | 977
Což mě přivádí k otázce, jaké je správné řešení? Moje řešení
je přímočaré, nepříliš čitelné a taky by nebylo vhodné pracovat tak
s každou službou. A to si služby poměrně často vyžadují instanci
Nette\Security\User
. Bohužel na to asi málokdo bere ohled kvůli
lazy loadingu. Vše tiše prochází, aniž by kdo věděl, že stačí zavolat
služby o chvilku dřív a celá aplikace se začne chovat jinak.
Editoval Pavel Janda (9. 12. 2015 12:55)
- David Matějka
- Moderator | 6445
A nevolas rovnou v tom konstruktoru EntityFactory metodu getIdentity()? jestli jo, tak ji volej dyl.
Jinak zpusob, jak asi nejrychleji nastavit user storage ns, je listener na Application::onRequest
- Pavel Janda
- Člen | 977
@DavidMatějka Myslíš později? Jj, pokud si uložím referenci na usera a teprve později ji použiji, tak to samozřejmě není problém. Spíš mi šlo o to, že pokud přijdou k projektu nezasvěcení, mohou nechtěně naprosto banálním zásahem způsobem velkou chybu.
No prostě je třeba myslet na to, že pokud vyžaduji usera v konstruktoru nepříliš-lazy služby, může se mi user pod rukama ještě docela měnit.
Editoval Pavel Janda (9. 12. 2015 15:27)