Přesměrování po přihlášení – storeRequest na každé stránce?
- Rypi
- Člen | 38
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
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
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
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).