Mám třídu LoginProcess, která mi zpracovává přihlášení z různých míst aplikace. V presenteru pak mám něco takvého:

$this->loginProcess->onError[] = function($process, $errors) {
    $this->payload->errors = $errors;
    $this->sendPayload();
};

$this->loginProcess->onSuccess[] = function($process, $customer) {
    $this->redirect('Account:');
};

$this->loginProcess->process($values);

Pak jsem si napsal LoginProcessListener, který naslouchal na onSuccess a já se divil, že se nevykoná. Ten redirect se samozřejm0 provede dřív :( Vyřešil jsem to tím, že jsem si udělal oddělený event onLogin, na který navěšuji listenery a ten redirect dělám až v onSuccess, který se zavolá později.

Otázka zní: nešlo by to v Kdyby\Events vyřešit lépe? Jednak bych spíše očekával, že se listenery provedou ještě před ručně navěšenou funkcí v presenteru. Druhak by určitě šlo odchytávat Excelption, kterou Nette hází (nejen) při redirectu a třeba ji vykonat až nakonec?

Co ty na to Filipe?

Jednak v naprosté většině případů mi dávalo daleko větší smysl (když jsem to psal), aby callbacky přidané v runtime měly větší prioritu a druhak myslím že to nemáš úplně nejlépe vyřešené. Pokud je loginProcess nějaká modelová třída a né komponenta, tak to mělo IMHO vypadat takhle.

$this->loginProcess->onError[] = function($process, $errors) {
    $this->payload->errors = $errors;
};

$this->loginProcess->process($values);

if ($this->payload->errors) {
    $this->sendPayload();
} else {
    $this->redirect('Account:');
}

Ale pokud si stále myslíš, že povolit redirecty z modelových tříd je dobrý nápad, můžeš na to použít IExceptionHandler, viz EventManager.


You must first log in to participate in this discussion