Flash message / vyhození erroru v manageru

popcorn
Člen | 28
+
0
-

Ahoj, jak mohu vytvořit error / flash message v Manageru kde zpracovávám data? Mám Manager:

public function newServer($server)
{

    if ($server == NULL)
    {
        $this->flashMessage('Wrong input format. Please try again.');
        exit();
    }

    $this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
        'name' => $server
    ]);
}

Formulář si generuju ve FormFactory:

public function create(callable $onSuccess): Form
{
    $form = $this->factory->create();
    $form->addText('server', 'Server name:');
    $form->addSubmit('submit', 'Add server');
    $form->onSuccess[] = function (Form $form, ArrayHash $values) use ($onSuccess) : void {
        $this->serverManager->newServer($values->server);
        $onSuccess();
    };
    return $form;
}

a Presenter:

protected function createComponentServerForm(): Form
{
    return $this->serverFactory->create(function (): void {
        $this->redirect('Home:');
    });

}
MajklNajt
Člen | 502
+
+7
-

FlashMessage nemá čo robiť v modeli, vyhoď výnimku, v presenteri zachyť a až tam generuj správu

filsedla
Člen | 101
+
+3
-

Tohle je docela zajímavý problém. Jak, přesně, byste to v téhle nové struktuře udělali?
Jediné logické místo, kam dát zachycení výjimky,

try {
    $this->serverManager->newServer($values->server);
} catch(InvalidServerParametersExceptio $e) { ... }

je do $form->onSuccess[] = function ... v ServerFormFactory. Ale tam také nejde volat flashMessage().

Andy3
Člen | 15
+
0
-

Asi nejak takto, urcite to pujde lepe… Pointa je: Neodchytavat Exception Nette (a uz vubec ne je vyhazovat, muzou v budoucnu zmizet). Pokud chces ten flashMessage, tak si to tam callbackem poslat taky, ale spis by ty errory mely byt na formulari a ne na Presenteru.

public function newServer($server)
{

    if ($server == NULL)
    {
       throw new \MyInvalidArgsException('bla');
    }

	try {
	    $this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
        	'name' => $server
    	]);
	} catch(\Exception $e) {
		\Tracy\Debugger::log($e, ILogger::ERROR);
 		throw  new \MyDatabaseProblemException($e->getMessage(), $e->getCode());
	}

	//nebo - ted nevim jestli to vraci false/null nebo vyhazuje vyjimku
	$result = $this->database->query('INSERT INTO '. self::TABLE_NAME. '', [
    	'name' => $server
    ]);

	if(!$result) {
		$e = new \MyDatabaseProblemException('bla');
        \Tracy\Debugger::log($e, ILogger::ERROR);
		throw $e;
	}

}
public function create(callable $onSuccess, callable $onError): Form
{
    $form = $this->factory->create();
    $form->addText('server', 'Server name:');
    $form->addSubmit('submit', 'Add server');
    $form->onSuccess[] = function (Form $form, ArrayHash $values) use ($onSuccess, $onError) : void {
        try{
			$this->serverManager->newServer($values->server);
		} catch(\MyInvalidArgsException $e) {
			$form->addError('spatny nazev serveru')
			$onError();
		} catch(\MyDatabaseProblemException $e) {
			$form->addError('Nepovedlo se vytvorit server');
			$onError();
		}

		$onSuccess();

    };
    return $form;
}
protected function createComponentServerForm(): Form
{
    return $this->serverFactory->create(
	function (): void {
        $this->redirect('Home:');
    },
	function (): void {
        $this->redirect('this');
    });

}

Jen technicka, pokud nekam posilas nejakou metodu z presenteru jako callback, tak na pozadi vlastne posilas cely presenter. Ono v podstate nicemu „nevadi“, jen dobre to mit na pameti.

Editoval Andy3 (11. 7. 2019 6:26)