Jak je to s Environment::getUser()? (re-opened)

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

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

Využij možnosti konfigurace (config.neon), resp. DI, viz. https://doc.nette.org/cs/configuring

Michal Vyšinský
Člen | 608
+
0
-

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

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

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

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

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!