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:
$this->getUser()->setFlash('name', 'This is flash message!');
A następnie możemy je wyświetlić w następujący sposób:
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:
$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:
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!
Warto przeczytać.
Trwa ładowanie…
hej, flash nie ginie zaraz po pobraniu. żyje przez jeden request.
Oczywiście, mój błąd. Po prostu zazwyczaj używa się go tylko w jednym miejscu, stąd to uproszczenie. Już poprawiam.
symfony- Pobieranie wszystkich wiadomości typu „flash”
Pingback: symfony: Generowanie adresu URL route’a w kontrolerze modułu. « Tomasz Kowalczyk
Hehe a ja właśnie kombinowałem dlaczego ciasteczka, sesje mi zapisuje a za żadne skarby nie chce zapisać we flash w sharedObject :D
Czyli cel osiągnięty – już wiesz dlaczego. ;] Warto poszperać w tym, co symfony ma „pod maską” – można dowiedzieć się naprawdę wielu ciekawych rzeczy.
Linkdump #45: Symfony2.