LeanMapper & DI: EntityFactory dostane závislost na Nette\Security\User příliš brzy

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

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
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Nějak si to vyřešil?

Felix
Nette Core | 1270
+
0
-

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
+
0
-

@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
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Neslo by v konstruktoru presenteru nastavit ten UserStorage? Dřív snad už nic není.

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

@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)