Přesměrování uvnitř modelu
- kleinpetr
- Člen | 480
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
- petr.jirous
- Člen | 128
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
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
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.