Front/Back module → jak na redirect?

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

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
+
0
-
$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)

Pitrrs
Člen | 6
+
0
-

To už jsem právě zkoušel a stejný efekt – chyba

EDIT: Ten tvůj edit moc pomohl. Díky! :)

Editoval Pitrrs (7. 5. 2014 13:34)

David Matějka
Moderator | 6445
+
0
-

v tom kodu je snad vic chyb nez pocet radku :))

  1. v presenteru nikdy nic nedelej v konstruktoru (maximalne predani zavislosti), nejdrive ve startupu (nebo v checkRequirements)
  2. v presenteru uz je sluzba user, pod $this->user (ale musis ve startupu, v konstruktoru jeste nebude)
  3. v presenteru nema vyznam volat $this->getPresenter() – to ti vrati stejny objekt
  4. pokud chces presmerovat na jiny modul, pouzij absolutni cestu – :Front:Homepage:login (dulezita je ta dvojtecka na zacatku)
  5. global $container vyrizni nozem z monitoru a zakopej dva metry do zeme. Nebo lepe – pouzivej dependency injection

Editoval matej21 (7. 5. 2014 13:36)

PavelJurasek
Člen | 39
+
0
-

Viz můj edit, kontroluj přihlášení v metodě startup

Mysteria
Člen | 797
+
0
-

Osobně používám tohle:

<?php
namespace AdminModule\Presenters;

abstract class BasePresenter extends \Nette\Application\UI\Presenter {
	protected function startup() {
		parent::startup();
		if(!$this->user->loggedIn) $this->redirect(':Front:Homepage:login');
	}
}
Pitrrs
Člen | 6
+
0
-

Tisíceré díky všem. Z chyb se poučím a rady určitě zužitkuji.

Oli
Člen | 1215
+
0
-

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)