Přesměrování po přihlášení – storeRequest na každé stránce?

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

Ahoj,

u své aplikace řeším přesměrování po přihlášení – na každé stránce je odkaz na přihlášení.

Podle starších témat jsem zkusil vytvořit actionLogin() nebo handleLogin(), tam uložit request a přesměrovat na přihlášení. Samozřejmě se ale uloží požadavek na login, takže k ničemu.

Napadlo mě na každé stránce (v layoutu) mít $presenter->storeRequest(), ale to asi taky není vhodné kvůli výkonu.

Umí nette nějaké vhodné řešení tohoto problému?

Díky

Jan Endel
Člen | 1016
+
0
-

co takhle?

class BasePresenter extends \Nette\Application\UI\Presenter
{
	/**
	 * @persistent
	*/
	public $backlink;

	protected function startup()
	{
		if (!$this->isLinkCurrent(':Front:Login:')) { // nebo LoginPresenter prostě z base neděd
			$this->backlink = $this->storeRequest();
		}
	}
}

no a s backlinkem už si v login formu poradíš :-).

Rypi
Člen | 38
+
0
-

Asi to nechápu, nebo to je špatně?

  • A tenhle kód v basepresenteru způsobí zacyklení přesměrování na stránkách
  • Ten kód podle mě vytvoří backlink pro všechny stránky kromě loginPresenteru, takže stejně výkon neušetřím
  • LoginPresenter samozřejmě dědí od Base presenteru – je tam spousta potřebných věcí, ale zkusil jsem to pro testování oddělit, stejně to nepomohlo.

Díky za případnou další radu…

trejjam
Backer | 65
+
0
-

Zacyklí se, protože přepsuješ persistentní parametr s každým requestem před kontrolou URL (v průběhu životního cyklu presenteru probíhá kontrola, jestli URL odpovídá znovu vygenerovanému URL z dostupných parametrů, pokud tato kontrola nenalezne shodnou URL přesměruje na novou).

K řešení, nemyslím si, že storeRequest() má nějaký velký overhead. Viz:

	public function storeRequest($expiration = '+ 10 minutes')
	{
		$session = $this->getSession('Nette.Application/requests');
		do {
			$key = Nette\Utils\Random::generate(5);
		} while (isset($session[$key]));

		$session[$key] = array($this->getUser()->getId(), $this->request);
		$session->setExpiration($expiration, $key);
		return $key;
	}

Pokud se ti i to zdá moc, tak si můžeš do odkazu na login dát aktuální URL ((string)Nette\Http\Request->getUrl() ← pseudokód), ale spíš bych používal storeRequest() (krom možných komplikací budeš mít hezčí URL).