Jakou implementaci interface zvolit?

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

Ahoj,

zkusím to rovnou vysvětlit na problému, který zrovna řeším. Používám jako identitu Doctrine entitu. V té mám uložená různá uživatelská nastavení (jazyk, měna, …). Tyto údaje bych měl ale rád dostupné i u nepřihlášených uživatelů a ideálně stejnou cestou ‚$this->user->identity‘, prostě vždy na stejném místě.

Samozřejmě mě napadlo řešení, mít na takové údaje nějakou service, které bude rozhodovat, co za data načíst (přihlášený ← nepřihlášený ← výchozí). Nicméně mě napadlo změnit ‚UserStorage‘. Bohužel, už ale nevím, jak docílit určení, které ‚UserStorage‘ se má použít (Měl bych 3 – původní, pro nepřihlášeného a s výchozími hodnotami).

Tím jsem se dostal k jádru pudla. ‚UserStorage‘ implementuje interface ‚IUserStorage‘. Pokud však budu mít více tříd, které implementují takový interface, jak někomu (nejspíše DI kontejneru) říci, který z těch interfaces mi má vrátit?

Díky za rady a případná objasnění, jak tohle všechno funguje.

PS: Kdyby to šlo řešit lépe a radostněji, rád dám na někoho, kdo nejenom tuší :-)

Martin

Felix
Nette Core | 1190
+
+1
-

Nepremyslel jsem jak to udelat jinak, ale poradim ti jak vyresit to co chces.

Udelej si neco jako StrategyUserStorage, ktere bude implementovat IUserStorage.

V configu si presne nadefinuj:

services:
    -
		class: App\Security\StrategyUserStorage
		setup:
			- addStorage(...vychozi..)
			- addStorage(...neprihlasene..)
			- addStorage(...puvodni..)

	# user, nette.user, security.user -> z hlavy nevim :-)
	user: Nette\Security\User(@\App\Security\StrategyUserStorage

A nemusis resit, ktery storage ti tam dosadi.

Rekl bych ale, ze by to slo vyresit podedenim originalniho (tzn. UserStorage) a jenom si prepises nejakou logiku, podle toho jestli je to guest nebo neprihlaseny.

Climber007
Člen | 105
+
0
-

Máš pravdu, možná to podědění bude nejmíň náročný. Nicméně strašně moc díky za inspiraci, jak podobné problémy řešit!