Správné použití Nette s Kdyby\Events a různé akce

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

@Jiří Nápravník: Viz mé poslední posty tady s Filipem, přesně na toto jsem se ptal

Jiří Nápravník
Člen | 710
+
0
-

@Filip Procházka: Díky za radu, ale není to v podstatě skoro to samé, jak klasické předání $message přímo v exceptioně? Protože přes ten new static nasadíš message, který pak vykreslíš. Jen je to čistěji napsané?

Ale je to asi lepší než mám teď.

Já to mám teď tak, že při úspěchu vrátím TRUE a při neúspěchu vracím objekt, který má v sobě ty informace. Pak si to v presenteru zkontroluji a vykreslím z toho objektu. Ale to je hodně nepraktické

akadlec
Člen | 1326
+
0
-

Pokud to bylo na mě, tak právě já to vidím jako čisté řešení. V presenteru zavolám manager s akcí, např to mazání, pokud manager nevyhodí výjimku tak normálně udělám flashku s úspěšnou zprávou, pokud se vyhodí exception tak podle toho jaká se vyhodila nastavím flashku třeba že tam jsou lidi, či že to je obsazeno atd. A nebo k tomu můžeš využít rovnou message co dojde ve vyhozené exception ne?

Filip Procházka
Moderator | 4668
+
0
-

Právěže ty message ve výjimkách by měly být pro programátora a ve flashkách by měly být message pro uživatele. Proto jsem v tom svém example naznačil že se k sestavení zprávy pro překlad použije kód a classa výjimky, což je jedna z mnoha možností. Každopádně předávat přímo message výjimky rozhodně není best practise.

Jiří Nápravník
Člen | 710
+
0
-

No právě to předání message z exception do flashmessage se mi taky nelíbí. Nakonec jsem to vymyslel (inspirován tvým konceptem takhle):

class CityRemovalException extends InvalidArgumentException
{

	private static $collisionResult;

	public static function relationRestriction(CityDeleteCollisionResult $collisionResult)
	{
		self::$collisionResult = $collisionResult;
		return new static();
	}

	public function renderMessage()
	{
		return 'Město nelze smazat, jelikož je nastaveno u celkem ' . self::$collisionResult->getEntries()[User::getClassName()] . ' uživatelů.';
	}

}

a presenter pak:

try {
	$this->cityFacade->deleteCityById($id);
	$this->flashMessage('Město bylo úspěšně smazáno.', 'success');
} catch (RecordNotFoundException $ex) {
	$this->error('City not found.');
} catch(CityRemovalException $ex){
	$this->flashMessage($ex->renderMessage(), 'danger');
}

pochopil jsem dobře?

akadlec
Člen | 1326
+
0
-

@Filip Procházka: No já taky nepoužívám message z exception, ale pochopil jsem že @Jiří Nápravník chce. Já bych to asi udělal jak jsem psal:

try {
    $this->cityFacade->deleteCityById($id);
    $this->flashMessage('Město bylo úspěšně smazáno.', 'success');
} catch (RecordNotFoundException $ex) {
    $this->error('City not found.');
} catch(CityInUseException $ex){
    $this->error('This city is in use.');
}
.
.
.
mkoubik
Člen | 728
+
0
-

Jiří Nápravník napsal(a):

No právě to předání message z exception do flashmessage se mi taky nelíbí. Nakonec jsem to vymyslel (inspirován tvým konceptem takhle):

Ten collisionResult bych si předal do konstruktoru té výjimky (a zrušil static), takhle je společný pro všechny instance.

Jiří Nápravník
Člen | 710
+
0
-

akadlec: ano takhle je to řešení samozřejmě nejlepší, ale nemáš tam nijak tu informaci o tom počtu, a ten počet bys v tomhle případě musel udělat tak, že ho přidáš jedině přes message, což je takové znásilnění. Anebo to, jako jsem poslal

mkoubik: jj, asi to tak bude nejlepsi, ja to delal na rychlo s moznosti, ze bych pouzival jednu tu vyjimku na vice pripadu pri mazani, ale to neni pekne:) díky

akadlec
Člen | 1326
+
0
-

Trošku to tu obnovím, zda jsem to pobral jak se to tady probíralo ;)

Mějme AccountModul kde se k jednotlivým entitám přidává avatar který je entita s MediaModul. A teď řeším akci mazání MediaEntity. Přemýšlím že to vyloučím do eventu jak tady uváděl @JiříNápravník v příkladu s městy. Takže si udělám MediaFileListener kde bude nějaká akce onDelete:

class MediaFilesListener extends Nette\Object implements Events\Subscriber
{
	public function onFileDelete(Entities\Files\IFile $fileEntity)
	{
		//...
	}
}

a tento listener vytvořím a zaregistruji v AccountModule extension je tak?

Tomáš Votruba
Moderator | 1114
+
0
-

Možná bych změnil název třídy, aby lépe odpovídal tomu, co dělá. Jinak ok.