Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF2][Symfony] Wyświetlenie danych z bazy na każdej stronie
Lirdoner
post 8.02.2017, 15:22:48
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post 8.02.2017, 15:27:36
Post #2





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




Czemu controller? Czemu nie zrobisz z tego serwisu, ktory bedzie te dana wyliczal tylko raz?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ohm
post 8.02.2017, 15:32:35
Post #3





Grupa: Zarejestrowani
Postów: 619
Pomógł: 143
Dołączył: 22.12.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Lirdoner
post 8.02.2017, 16:19:00
Post #4





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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']


Ten post edytował Lirdoner 8.02.2017, 16:20:20
Go to the top of the page
+Quote Post
nospor
post 8.02.2017, 16:23:01
Post #5





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Lirdoner
post 8.02.2017, 16:23:03
Post #6





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post 8.02.2017, 16:24:47
Post #7





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




No to z jakiegos powodu token nie zwraca ci usera. Co pisze ci konsola symfony dla tego wyjatku? Moze gubisz sesje?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Lirdoner
post 8.02.2017, 21:28:18
Post #8





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Lirdoner 8.02.2017, 16:30:02
Go to the top of the page
+Quote Post
nospor
post 9.02.2017, 09:48:13
Post #9





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




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 :/


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Lirdoner
post 9.02.2017, 11:58:37
Post #10





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
nospor
post 9.02.2017, 12:05:13
Post #11





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




No to ladnie. Dzieki za info, przyda sie na przyszlosc smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 20:48