Jak je to s Environment::getUser()? (re-opened)
- zoltan_mikes
- Člen | 3
Zdravím, původně jsem chtěl dotaz přidat k tomuto vláknu , ale to už je bohužel locknuté :( …
Jde mi o to, že při příhlášení dostane uživatel z externího API dočasný klíč, který potřebuji uchovat v Identity a při všech dalších requestech na API používat tento obdržený klíč.
Problém je ten, že operace s API mám v modelu (a nikoliv v presenteru, odkud je Identita dostupná přes $this->getUser() )… Zároveň bych nerad klíč předával jako parametr při každém volání z presenteru…
Chci se tedy dotázat, jakým způsobem (jinak než přes Nette\Environment::getUser()->getIdentity() který sice stále funguje, ale je deprecated…) mám jednoduše, mimo presenter, např. v modelu, přistupovat k aktuální identitě přihlášeného uživatele?
Budu vděčný za jakoukoliv konstruktivní radu :)
- Ot@s
- Backer | 476
Využij možnosti konfigurace (config.neon), resp. DI, viz. https://doc.nette.org/cs/configuring
- Michal Vyšinský
- Člen | 608
Injektni si do modelu/ů službu Nette\Security\User v konstruktoru. (Předpokládám, že máš modely jako služby)
- zoltan_mikes
- Člen | 3
Díky moc za vaše tipy (byť teoretické) :)
Vzhledem k obsáhlosti dokumentace ohledně DI, zde nastíním, jak jsem to za pomocí více zkušeného kolegy vyřešil v praxi:
Do „config.neon“ jsem za definici služby přidal „(@container)“
common:
nette:
services:
userRepository : UserRepository(@container)
V „UserRepository“ jsem následně definoval proměnou „$container“ jako „protected“ a posléze v constructoru (nebo kdekoliv jinde) s ní už pak lze normálně pracovat
abstract class UserRepository extends Nette\Object
{
protected $container;
public function __construct()
{
if (isset($this->container->user) && $this->container->user->isLoggedIn())
{
$user_identity = $this->container->user->getIdentity();
if (!is_null($user_identity))
{
$user_data = $user_identity->data;
}
}
}
}
Je na tomto přístupu něco vyloženě „špatně“? Případně, doporučili byste nějaký jiný, lepší approach?
- enumag
- Člen | 2118
Tebou popsaný způsob nemůže vůbec fungovat (sekce services nemá v neonu co dělat v sekci nette, konstruktoru chybí parametr…).
common:
services:
# o předání instance Nette\Security\User se postará autowiring
userRepository: UserRepository
abstract class UserRepository extends Nette\Object
{
protected $user;
public function __construct(Nette\Security\User $user) {
$this->user = $user;
}
}
- Michal Vyšinský
- Člen | 608
No když už takto, tak bych nepředával celý kontejner, ale jen službu
uživatele:
neon:
common:
services:
userRepository : UserRepository
UserRepository:
abstract class UserRepository extends Nette\Object
{
protected $user;
public function __construct(Nette\Security\User $user)
{
$this->user = $user;
if ($this->user->isLoggedIn())
{
$user_identity = $this->user->getIdentity();
if (!is_null($user_identity)) // tato podmínka je IMO úplně zbytečná
{
$user_data = $user_identity->data;
}
}
}
}
Ta podmínka je zbytečná proto, že když je uživatel přihlášen tak logicky má identitu (nikdy není null)
Editoval CherryBoss (17. 6. 2013 15:26)
- zoltan_mikes
- Člen | 3
Díky za feedback. V postnutém confu bylo „nette:“
samozřejmě navíc – my bad.
Zbytečnou podmínku jsem taky odstranil a kód přepsal doporučeným
způsobem.
Díky!