Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][SF][SF2] Globalny obiekt w kontrolerze
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
Mam wiele różnych akcji w kontrolerze, które traktuje jak komponenty w sf1. wywołuje je z poziomu twiga.

  1. /**
  2. * Top component action.
  3. *
  4. * @param Request $request
  5. * @return \Symfony\Component\HttpFoundation\Response
  6. */
  7. public function languageSwitchAction(Request $request)
  8. {
  9. $menuObj = $this->getDoctrine()->getRepository('ProjectBackendBundle:Menu')->getMenuBy($request->get('slug'));
  10. ....
  11.  
  12.  
  13. return $this->render('ProjectFrontendBundle:Partial:_languageSwitch_default.html.twig');
  14. }
  15.  
  16. /**
  17. * Top component action.
  18. *
  19. * @param Request $request
  20. * @return \Symfony\Component\HttpFoundation\Response
  21. */
  22. public function menuAction(Request $request)
  23. {
  24. $menuObj = $this->getDoctrine()->getRepository('ProjectBackendBundle:Menu')->getMenuBy($request->get('slug'));
  25. ...
  26.  
  27. return $this->render('ProjectFrontendBundle:Partial:_menu_default.html.twig');
  28. }
  29.  


Jak "najlepiej" udostępnić dla każdej akcji obiekt $menuObj, tak żeby nie szło zapytanie do bazy za każdym razem questionmark.gif

Dodam, że korzystam z dwóch kontrolerów: jeden głowny który odpala strony, a drugi powyższy. Akcja w pierwszym odpala się pierwsza i może pobierać obiekty...Chcę tylko, żeby drugi kontroler widział obiekty, wygenerowane przez pierwszy... lub za pomocą jakiegoś serwisu je pobierał...


Ktoś wie co z tym zrobić? Może przez sesję....chociaż serializowanie encji to nienajlepszy pomysł.....
Crozin
Po prostu obiekt menu utwórz jako usługę w DICu: http://symfony.com/doc/master/book/service_container.html
blackroger
Ok...Dzięki.

Dobra po spędzonej nocce udało mi się rozwiązać problem. Piszę dla potomnych.

Symfony 2 w serwisach tworzy automatycznie instancje typu singletone. Utworzyłem zwyczajną klasę serwisową:

  1. public function __construct(Container $container)
  2. {
  3. $this->container = $container;
  4. $this->em = $container->get('doctrine')->getEntityManager();
  5. }
  6.  
  7. /**
  8.   * Returns menu object.
  9.   *
  10.   * @return Menu
  11.   */
  12. public function getMenu()
  13. {
  14. if($this->menuObj)
  15. {
  16. return $this->menuObj;
  17. }
  18.  
  19. // gets repository
  20. $repositoryObj = $this->em->getRepository('ProjectBackendBundle:Menu');
  21.  
  22. if($this->container->isScopeActive('request')
  23. && $this->container->has('request'))
  24. {
  25. $requestObj = $this->container->get('request');
  26.  
  27. $this->menuObj = $repositoryObj->getMenuBySlug($requestObj->get('slug'));
  28. }
  29. else
  30. {
  31. $this->menuObj = $repositoryObj->getHomeMenu();
  32. }
  33.  
  34. return $this->menuObj;
  35. }


W celu uniknięcia ciągłych zapytań przy wywołaniu getMenu trzeba zablokować wywołanie całej metody getMenu w przypadku, gdy $this->menuObj już istnieje.
Poniższy warunek to załatwia.
  1. if($this->menuObj)
  2. {
  3. return $this->menuObj;
  4. }


W ten sposób mamy ogólnodostępny obiekt encji, którego zapytanie do bazy wykona się tylko raz niezależnie od liczby pobrań.
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.