Přihlášení: Přechod z 2.4 na 3.0

Quixe
Člen | 10
+
0
-

Měl jsem Nette 2.4
kde jsem k přihlášení uživatele používal:

$netteUserLogin = Nette\Environment::getUser();

tam jsem využíval metody isLoggedIn(), login(), getId() atd.

Při přechodu na Nette 3.0 jsem v kódu změnil

Nette\Environment::getUser();  na  new Nette\Security\User();

ale vypisuje to chybu Fatal error: Uncaught Nette\InvalidStateException: UserStorage has not been set. in /www/doc/www.beeffco.com/www/wd/vendor/nette/security/src/Security/User.php:75

Co s tím? Jak to nejjednodušejí opravit? Vygooglil jsem v manuálu $user = $this->getUser(), ale nevím jak to použít. Ani dependency injection. Ale ten manuál Nette je jen pro chytrý…

Editoval Quixe (7. 7. 2021 12:40)

Šaman
Člen | 2634
+
+3
-

A co na tomhle není pochopitelného? S tím, že se jedná o použití v presenteru.

$user = $this->getUser(); // tvůj $netteUserLogin

Mimochodem, to tě netrklo, že operátorem new vytváříš čistý, prázdný objekt User bez jakýchkoliv závislostí? To je přesně důvod, proč by operátor new v Nette aplikacích měl působit jako vykřičník. Pokud nevíš, že opravdu chceš new (třeba Date, nebo DateInterval), tak je jeho použití nejspíš chyba.

Editoval Šaman (7. 7. 2021 17:40)

Quixe
Člen | 10
+
0
-

Díky za odpověď. Nicméně když napíšu jen

$user = $this->getUser()

tak mi to hodí chybu
Using $this when not in object context

Neumím používat ty presentery či DI. Četl jsem to už vícekrát, ale stejně to nechápu:-(

Děkuji za radu

Editoval Quixe (7. 7. 2021 14:27)

Kamil Valenta
Člen | 758
+
0
-

Není dobré psát v Nette appku s přihlašováním uživatelů a nerozumět ještě tak základní věci, jakou presentery jsou. Velmi doporučuji nejprve nastudovat problematiku presenterů a pak se pustit do ověřování uživatele…
A mimochodem, presentery přece byly i ve 2.4, moc nechápu, jak ta appka tedy vypadá…

Editoval Kamil Valenta (7. 7. 2021 15:55)

Šaman
Člen | 2634
+
+2
-

Quixe napsal(a):

Nicméně když napíšu jen

$user = $this->getUser()

tak mi to hodí chybu
Using $this when not in object context

To je hodně divné. To říká, že nejsi v žádném objektu. Tedy ani v modelové třídě, nebo v komponentě.
Jenže v Nette bys naopak měl být vždy v objektu, výjimkou je index.php, který to celé jen spustí a do kterého většinou nezasahuješ.

Opravdu bys asi měl začít Nette Sandboxem a pochopit aspoň základy. Jinak budeš narážet stále.

Editoval Šaman (7. 7. 2021 17:39)

Quixe
Člen | 10
+
0
-

Nebo když napíšu

$netteUserLogin = new Nette\Security\User();

tak mi to hodí
Uncaught Nette\InvalidStateException: UserStorage has not been set.

David Matějka
Moderator | 6445
+
+1
-

Pošli tvůj kód, odkud se snažíš získat toho usera

Quixe
Člen | 10
+
0
-

Abych to zkrátil, tohle je hlavní stránka, kde je načtení Nette, autoloader a sessiony.


require 'vendor/autoload.php';

$configurator = new Nette\Configurator;
$configurator->setTempDirectory("tempNette");

$container = $configurator->createContainer();

$session = $container->getByType('Nette\Http\Session');
$sessionSectionLogin = $session->getSection('sessionSectionLogin');
$sessionSectionLogin->setExpiration(86400, 'temporyCompany');

$autoloader = new Nette\Loaders\RobotLoader;
$autoloader->addDirectory('class');
$autoloader->setTempDirectory('tempNette');
$autoloader->register();


//původně: $netteUserLogin = Nette\Environment::getUser();
/*nově: */
$netteUserLogin = new Nette\Security\User();

if($netteUserLogin->isLoggedIn() === FALSE) echo "nepřihlášen";
else echo "přihlášen";

Editoval Quixe (8. 7. 2021 9:39)

David Matějka
Moderator | 6445
+
+1
-

Použij getByType na získání toho usera, podobně jako to děláš se session

Quixe
Člen | 10
+
0
-

David Matějka napsal(a):

Použij getByType na získání toho usera, podobně jako to děláš se session

Wow, pomohlo to. Tolik jste mi pomohl! Moc děkuji, děkuji, děkuji.

$netteUserLogin = $container->getByType('Nette\Security\User');

Editoval Quixe (8. 7. 2021 10:29)