This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Problemy, jakie napotykamy podczas programowania wszelkiego rodzaju aplikacji można podzielić na dwie główne kategorie - wymagające doświadczenia i wymagające wiedzy. O ile te związane z doświadczeniem można rozwiązać bez pomocy innych - rozwiązania można po prostu wywnioskować na podstawie doświadczenia, o tyle związane z wiedzą nie są takie proste. Ich rozwiązanie to zdobycie informacji o tym, co należy zrobić, żeby było dobrze, a do rzeczonej informacji czasem bardzo ciężko się dostać. W dzisiejszym wpisie chciałbym właśnie dla swojej i Waszej referencji opisać jeden problem związany z “wiedzą” w symfony.

symfony: Pobieranie wszystkich wiadomości typu "flash".

Framework symfony, podobnie jak kilka innych na rynku oferuje funkcjonalność tzw. "flashów" [flashy?]. Czym jest flash? Otóż, jest to jednorazowa wiadomość [komunikat, informacja - ogólnie jakaś wartość, najczęściej typu string], która kasuje się automatycznie po wyświetleniu, a właściwie pobraniu z kontenera która jest przechowywana tylko podczas jednego żądania - jest ona usuwana pod koniec jego wykonywania [dzięki za komentarz, @Kuba ;]]. Może to np. być komunikat o poprawnym zalogowaniu w serwisie - wiadomo, że wyświetlimy go tylko raz po zalogowaniu, bo potem jest on zwyczajnie niepotrzebny.

Flashe w symfony tworzymy w następujący sposób:

1
$this->getUser()->setFlash('name', 'This is flash message!');

A następnie możemy je wyświetlić w następujący sposób:

1
echo '<span class="flash">'.$sf_user->getFlash('name').'</span>';

Problem powstaje jednak w momencie, kiedy chcemy uzyskać listę wszystkich zarejestrowanych w trakcie wykonywania skryptu wpisów. Otóż zmienna $sf_user [obiekt klasy sfUser] niestety nie posiada metody getAllFlashes(), albo jakiejkolwiek innej, która realizowałaby jej założenia.

Oczywiście my wiemy w kontrolerze, jakie nazwy nadaliśmy naszym wiadomościom, ale dobrze byłoby dostać listę zarejestrowanych, zamiast próbować wszystkich identyfikatorów. Przyznam, że w Internecie jest bardzo mało informacji na ten temat i aż się zdziwiłem, kiedy znalazłem rozwiązanie dopiero gdzieś w małym poście na grupach dyskusyjnych symfony. Czy nikt nie miał wcześniej tego problemu i nie potrzebował takiej listy? Dziwne, ale może faktycznie każdy używał flashów zgodnie z ich założeniem używając jednej nazwy w całym serwisie.

Cóż, nawet jeśli tak było, to zgodnie ze wstępem publikuję kod, pozwalający na pobranie listy wszystkich wiadomości typu flash w symfony 1.4:

1
$allFlashes = $sf_user->getAttributeHolder()->getAll('symfony/user/sfUser/flash');

W zmiennej $allFlashes znajduje się prosty array zawierający klucze i wartości poszczególnych flashów. Można z niego skorzystać np. tak:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
foreach($allFlashes as $flash => $value)
	{
	$flashMessage = $sf_user->getFlash($flash);
	switch($flash)
		{
		// different flash types as case options
		default:
			{
			echo '<div class="flash">'.$flashMessage.'</div>';
			}
		}
	}

Tym pozytywnym akcentem pragnę zakończyć dzisiejsze rozważania - do zobaczenia w piątek!