Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF2][Symfony] Wyświetlenie danych z bazy na każdej stronie
Forum PHP.pl > Forum > PHP > Frameworki
Lirdoner
Witam, chcę w headerze wyświetlić ilość nieprzeczytanych przez użytkownika wiadomości. Muszę to zrobić w dwóch miejscach.
Mam taki element w widoku
  1. <li class="nav-item dropdown">
  2. <a class="nav-link dropdown-toggle" href="#" id="profile" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  3. <span class="badge badge-success">LICZBA WIADOMOŚCI</span>
  4. {{ app.user.username }}
  5. </a>
  6. <div class="dropdown-menu" aria-labelledby="profile">
  7. <a class="dropdown-item" href="#">
  8. Wiadomości
  9. <span class="badge badge-success">LICZBA WIADOMOŚCI</span>
  10. </a>
  11. <a class="dropdown-item" href="{{ path('logout') }}">Wyloguj</a>
  12. {% if is_granted('ROLE_ADMIN') %}
  13. <a class="dropdown-item" href="{{ path('admin_homepage') }}">Panel administracyjny</a>
  14. {% endif %}
  15. </div>
  16. </li>

robiąc {{ render(controller(...)) }} niepotrzebnie dwa razy wykonuje to samo zapytanie do bazy. Jaki inny sposób polecacie?
nospor
Czemu controller? Czemu nie zrobisz z tego serwisu, ktory bedzie te dana wyliczal tylko raz?
ohm
Możesz zrobić listenera który będzie naliczał użytkownikowi ilość nieprzeczytanych wiadomości (po zapisaniu nowej wiadomości) i zapisywał tę wartość w tabeli użytkownika - wyświetlanie bedziesz miał proste bo tylko zrobisz app.user.unread_messages (zwał jak zwał wink.gif ) lub możesz wykorzystać do tego twig extension i tam stworzyć globalną funkcję dla twiga w której będziesz zliczał ilość wiadomości
Lirdoner
Dzięki za pomoc, stworzyłem już serwis z takim kodem
  1. <?php
  2.  
  3. namespace AppBundle\Model;
  4.  
  5. use Doctrine\ORM\EntityManager;
  6. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
  7.  
  8. class User
  9. {
  10. private $em;
  11. private $user = null;
  12.  
  13. private static $userdata = array();
  14.  
  15. public function __construct(EntityManager $em, TokenStorage $token)
  16. {
  17. if($token = $token->getToken())
  18. $this->user = $token->getUser();
  19.  
  20. $this->em = $em;
  21. }
  22.  
  23. public function getUnreadMessagesCount()
  24. {
  25. if(isset( self::$userdata['unreadMessagesCount'] ))
  26. return self::$userdata['unreadMessagesCount'];
  27.  
  28. self::$userdata['unreadMessagesCount'] = (...)
  29.  
  30. return self::$userdata['unreadMessagesCount'];
  31. }
  32. }

Problem w tym, że od czasu do czasu dostaję wyjątek "Error: Call to a member function getEmail() on null". getEmail() to funkcja z $this->user->getEmail().
Jestem poprawnie zalogowany na stronie.
services.yml:
Kod
app.user:
    class: AppBundle\Model\User
    arguments:    ['@doctrine.orm.entity_manager', '@security.token_storage']
nospor
Przeciez tutaj nigdzie nie wywolujesz getEmail()... przesledz sciezke wyjatku

ps: i czemu userdata zrobiles jako static dla klasy? To powinna byc wlasciwosc obiektu. obiekt serwisu powinien byc wywolywany jako singleton czyli jedna instancja obiektu
Lirdoner
Wywołuję w metodzie getUnreadMessagesCount(). Tam jest zapytanie dość duże dlatego usunąłem podając tutaj. Wystarczy, że odświeżę stronę i wyjątek znika.
nospor
No to z jakiegos powodu token nie zwraca ci usera. Co pisze ci konsola symfony dla tego wyjatku? Moze gubisz sesje?
Lirdoner
Racja, wyrzuciłem tą zmienną statyczną i dodałem liczbę nieprzeczytanych wiadomości jako właściwość obiektu. Serwis dodałem jako globals dla twiga i aktualnie wywołuję go tylko w jednym szablonie przez userdata.getUnreadMessagesCount()
[code] twig:
globals:
userdata: "@app.user" [\code]
Teraz jak na złość wszystko działa biggrin.gif Wrzucę co mówi konsola gdy znowu wywołam ten bład. Tak czy siak, dzięki za pomoc.

Ok, ogólnie to dziwny problem - zauważyłem, że dostaję tego exceptiona gdy zmienię choćby jedną literę w szablonie TWIG. Potem F5 i już wszystko gra
Ktoś wie co może być problemem? Co do konsoli to nic konkretnego nie mówi, widzę, że jest zalogowany poprawnie
nospor
Cytat
Ok, ogólnie to dziwny problem - zauważyłem, że dostaję tego exceptiona gdy zmienię choćby jedną literę w szablonie TWIG. Potem F5 i już wszystko gra
Ktoś wie co może być problemem? Co do konsoli to nic konkretnego nie mówi, widzę, że jest zalogowany poprawnie
Gdy zmienisz cos w twig to on przebudowuje cache zapewne i cos tam mu wtedy nie pasi... I zgaduj zgadula teraz co :/
Lirdoner
Ok, znalazłem kilka pomocnych linków: http://stackoverflow.com/questions/2491663...-twig-extension
Zmiana polegała na wyrzuceniu z konstruktora TokenStorage i zamiast niego wstrzyknięcie ContainerInterface, a potem już tylko $this->container->get('security.token_storage')->getToken()->getUser() (rzecz jasna po sprawdzeniu czy getToken() i getUser() zwraca obiekt)
nospor
No to ladnie. Dzieki za info, przyda sie na przyszlosc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.