Jakou implementaci interface zvolit?
- Climber007
- Člen | 105
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 | 1199
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
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!