Vrátenie novej identity do usera

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

Ahojte,

pracujem na jednom väčšom projekte v nette a natrafil som na celkom pre mňa závažný problém. Vytvoril som si editáciu užívateľa kde si užívateľ dokáže meniť svoje údaje a pod. (aké prekvapenie :D) No však po zmenení údajov sa do DB zapíšu ale neviem ako ich po editácii znova nahrať do triedy user.

Písal som aj na iné fórum kde mi povedali že ho mám odhlásiť s nejakou flashmessage čo v mojom prípade neprichádza do úvahy.

Ďakujem

h4kuna
Backer | 740
+
0
-

Musíš mít nějaký objekt, který ti tvoří identitu, ve smyslu jaký hodnoty v ní chceš držet. Nazveme ho IdentityFactory.

Pak máš authenticator který přihlašuje uživatele podle hesla, facebooku, twitteru, mojeId, tokenu z API nebo podle id uživatele. A to je tvůj případ pokud změníš něco v profilu, tak toho človíčka znova přihlaš podle id. Metoda login nad třídou User přijímá instanci IIdentity.

Příklad.

<?php

class Authenticator {

	/** @var \Nette\Security\User */
    private $user;

    /* constructor */

	public function loginId($userId)
	{
        $identity = $this->identityFactory->create($userId);
        $this->user->login($identity);
    }
}
?>

EDIT: Náš Authenticator v tomto případě neimplementuje IAuthenticator.

Editoval h4kuna (18. 8. 2016 8:23)

Lukes
Silver Partner | 68
+
+4
-
$this->user->getIdentity()->name = $name;

Podle mě spíše potřebuješ tohle. Asi možná zbytečné vytvářet novou identitu.

Gavrilo
Člen | 46
+
0
-

Lukes pri editácii užívateľa je práve asi lepšie riešenie nad tebou … Vieš si predstaviť ten kód pri editácii užívateľa s 20 columami ?

Gavrilo
Člen | 46
+
0
-

H4kuna nebolo by možno lepšie hodiť tuto metódu do modelu UserManagera. Kde mám riešenú správu užívateľa s registráciou a všetkým okolo toho ?

Oli
Člen | 1215
+
+1
-

Další možností by bylo načítat uživatele s každým requestem. Pak budeš mít vždy aktuální data. Můžeš i normálně zabanovat uživatele. Bez toho by jsi ho sice zabanoval, ale projevilo by se ti to až by se odhlásil a chtěl znova přihlásit :-)

Lukes
Silver Partner | 68
+
+2
-

Gavrilo napsal(a):

Lukes pri editácii užívateľa je práve asi lepšie riešenie nad tebou … Vieš si predstaviť ten kód pri editácii užívateľa s 20 columami ?

Stačí projít cyklem, ale asi by si měl mít potom plnou kontrolu nad tím, co v tom poli máš :-)

foreach($data as $key => $item)
{
	$this->user->getIdentity()->$key = $item;
}

Editoval Lukes (18. 8. 2016 9:52)

newPOPE
Člen | 648
+
+1
-

@Gavrilo ked nad tym moc nechces meditovat na Identity v User sa vykasli a pouzivaj load user udajov z DB podla userID napr. $this->user->id (pripadne si tam das nejaky userProvider). To ti vo vacsine pripadov bude postacovat.

Data v Identity sa tak ci tak drzia defaultne v SESSION cize to mozes povazovat za cache. Este je moznost si napisat vlastnu Identity tak aby tieto udaje tahala z DB…

Editoval newPOPE (18. 8. 2016 9:55)

Gavrilo
Člen | 46
+
0
-

NewPope ale tým by som sa ukratil o getidentity() v latte a musel by som to tam renderovat co mi nepríde uplne ako BP

newPOPE
Člen | 648
+
+1
-

@Gavrilo ano to mas pravdu (ja to tak pouzivam tak mi to netuklo). Ako som pisal o vlastnej Identity tu vlastne zrejme nepotrebujes staci napisat si vlastnu UserStorage ktora je injektovana do Usera a vsetko ti bude ficat nadalej.

Oli
Člen | 1215
+
+1
-

Můžeš se inspirovat tady: https://github.com/…ity-doctrine. Pokud jsem někde něco neměnil, jakože asi neměnil, tak ti to zaručí to, že se to pokaždé zeptá do databáze. A zároveň ti to předá User entitu do $user->getIdentity().

Ty nepoužíváš Doctrine entity, tak by sis asi musel napsat nějakou vlastní entitu… (něco co bude implementovat IIdentity (myslím).

h4kuna
Backer | 740
+
+2
-

@Gavrilo jde o to, aby každá třída zodpovídala za jednu věc. UserManager se stará o přípravu dat. Nikoliv o zajištění identity a nastaveni objektu User. To je jen doporučení je na tobě jak si to uděláš.

GEpic
Člen | 566
+
0
-

Pokud se dají měnit uživatelské údaje (a navíc uživatel může měnit jen svoje) pouze na jednom místě, nemá smysl to cpát kamkoliv jinam a vymýšlet složitosti.

Celou aktualizaci User\Identity bych provedl ve zpracování formuláře a hotovo, jak navrhoval @Lukes, máš to na 3 řádky a máš vystaráno, můžeš přidávat a odebírat sloupce a ten kód stejně bude fungovat.

Nic světabornějšího a rychlejšího stejně nevymyslíš.

Editoval GEpic (19. 8. 2016 6:58)