Přesměrování uvnitř modelu

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

Zdravím,

četl jsem pár diskuzí kde je jasně řečeno, že redirect z modelu není nejlepší řešení, ale v mém případě, kde přes model komunikuji s API a kontroluji response, je to celkem podstatná věc, protože zde rozhoduji co se bude dít dál a někdy potřebuji např. zapsat flashku a přesměrovat na homepage a samozřejmě je možnost vyhazovat nějakou exceptionu a odchytávat ji v Presenterch, jenže těch míst kde model volám je hrozně moc a chtěl bych to řídit centrálně v modelu, takže se ptám, jak mohu přesměrovat z modelu ? Díky

Martk
Člen | 656
+
0
-

Nemáš nějakou konkrétní ukázku? Takhle se špatně radí. Redirectu v modelu bych se každopádně vyhnul velkým obloukem, tohle je parketa pro presentery případně controly, jak píšeš.

Editoval Antik (25. 2. 2016 14:32)

petr.jirous
Člen | 128
+
+1
-

co použít eventy? Mrkni na Kdyby\Events. V modelu pak můžeš volat např. něco takového:

$this->onApiResponse($this, $apiResponse);

a v presenteru pak takto nastavíš, co se při té události bude dít

$this->myModel->onApiResponse[] = function (MyModel $model, $apiResponse) {
	$this->redirect('success');
};

Editoval petr.jirous (25. 2. 2016 14:56)

kleinpetr
Člen | 480
+
0
-

Dobře, uleželo se mi to v hlavě a nechám to tedy na presenteru. Jen nevím co dělám špatně při odchytávání vyjímky:

Zkrácená ukázka:

model:

public function proceedGet(){
	return $this->getResponse();
}

public function getResponse(){
	//nejaky request případně vyjímka
	throw new ResponseException('exception',...);
}

presenter:

protected function createComponentList()
    {
        try {
            $response = $this->list->proceedGet();
			$list = $this->listModel->response($response);
        } catch (ResponseException $e) {
            $list = new EmptyControl();
            $this->flashMessage($e->getMessage());
        }

        return $list;
    }

Tohle je v rychlosti to o co se snažím, ale vyjímku mi vyhodí laděnka a pokud ji vypnu tak hodí 500, zkrátka se v tom presenteru neodchytí.

@petr.jirous o těch eventech jsem už slyšel, ale ještě jsem se nedostal k tomu se na to podívat. Asi na to konečně mrknu :) díky za tip

Editoval kleinpetr (25. 2. 2016 14:44)

Barvoj
Člen | 60
+
+3
-

petr.jirous napsal(a):

co použít eventy? Mrkni na Kdyby\Events. V modelu pak můžeš volat např. něco takového:

$this->onApiResponse($this, $apiResponse);

a v presenteru pak takto nastavíš, co se při té události bude dít

$this->myModel->onApiResponse[] = function (MyModel $model, $apiResponse) {
	$this->redirect('success');
};

Pokud se nepletu, tak to co píšeš umí nette samo o sobě – stačí podědit Nette\Object. Kdyby\Events na to nejsou potřeba.

kleinpetr
Člen | 480
+
0
-

Tak problém byl trochu jinde

vyjímka vznikla v renderMetode te komponenty kterou vytvářím, a nedošlo mi, že se volá až při vykreslování komponenty, tudíž tam už jí neodcyhtávám.

Martk
Člen | 656
+
-3
-

Odchytávaní by mohlo jít globálně v metodě run, ale asi to nebude lepší, než odchytávat jednotlivě.