Front/Back module → jak na redirect?
- Pitrrs
- Člen | 6
Ahoj,
několik hodin řeším takovou prkotinu. Mám vytvořené Front a Back
moduly s routováním (admin a verejna cast).
Back modul mam řešený tak, že jsem si vytvořil hlavní třídu
„AdminPresenter“, kterou pak chci dědit ve všech částech adminu.
Řeším tam přihlášeného uživatele. Potřebuji, pokud uživatel není přihlášen, přesměrovat na login část frontu.
construct třídy vypadá nějak takhle:
public function __construct(){
global $container;
$this->user = $container->getService('user');
if (!$this->user || !$this->user->isLoggedIn()){
$this->getPresenter()->redirect("Front:Homepage:login");
}
}
a v na začátku constructu každé děděné třídy volám parent::__construct();
Ovšem na tom redirectu mi laděnka vždy vyhodí chybu; konkrétněji
na:
/Nette/Application/UI/Presenter.php:777
na tom řádku je:
$presenterFactory = $this->application->getPresenterFactory();
Dočetl jsem se, že redirect vždy hazi nějaky exception, ale jak to ošetřit? Resp. Jak bych měl zabránit neatorizovanému uživateli přístup do adminu? Viděl jsem několik tutoriálů, ale moc mi nepomohli – jsou špatně vysvětlený (alespon pro mě, co by Nette začátečníka).
Děkuji předem za reakce.
Editoval Pitrrs (7. 5. 2014 13:13)
- PavelJurasek
- Člen | 39
$this->getPresenter()->redirect(":Front:Homepage:login"); // dvojtečka na začátku
Edit:
kontroluj přihlášení ve startup
methodě presenteru, ne
v konstruktoru!
Potom to tedy bude vypadat asi takto
public function startup()
{
parent::startup();
if (!$this->user->isLoggedIn()) {
$this->redirect(":Front:Homepage:login");
}
}
Editoval PavelJurasek (7. 5. 2014 13:33)
- David Matějka
- Moderator | 6445
v tom kodu je snad vic chyb nez pocet radku :))
- v presenteru nikdy nic nedelej v konstruktoru (maximalne predani zavislosti), nejdrive ve startupu (nebo v checkRequirements)
- v presenteru uz je sluzba user, pod
$this->user
(ale musis ve startupu, v konstruktoru jeste nebude) - v presenteru nema vyznam volat
$this->getPresenter()
– to ti vrati stejny objekt - pokud chces presmerovat na jiny modul, pouzij absolutni cestu –
:Front:Homepage:login
(dulezita je ta dvojtecka na zacatku) global $container
vyrizni nozem z monitoru a zakopej dva metry do zeme. Nebo lepe – pouzivej dependency injection
Editoval matej21 (7. 5. 2014 13:36)
- Oli
- Člen | 1215
Jakou chybu? Myslím ,že ten redirect máš špatně. Pokud se chceš přepínat mezi modulama, tak před název modulu dej taky dvojtečku
A celkově k tomu přistupuješ si myslím blbě. Do toho AdminPresenteru si dej do startup metody něco jako:
protected function startup()
{
parent::startup();
if (!$this->getUser()->isLoggedIn()) {
$this->redirect(':Front:Homepage:login');
}
}
Treba vubec nevím proč tam máš to global a proč vubec šaháš na container :-) Tohle funguje i bez toho. Každopádně to dej do startup metody. V construktoru si tahej jen závislosti z config.neon.
EDIT: Než jsem to sesmolil tak 6 komentářů. Takže můj komentář už je useless :-)
Editoval Oli (7. 5. 2014 13:40)