Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][SF2][SF] - Kontener usług
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
Mam pewną metodę, którą potrzebuję używać w wielu akcjach kontrolera.
Aby nie powielać kodu zastanawiałem się czy nie powinienem zrobić nowy serwis w kontenerze usług i wstrzykiwać ją ?
Jak powinienem to zrobić aby było to zgodne z dobrymi praktykami ?

Metoda wygląda tak:

  1. protected function getCurrentMatchday(){
  2. $repository = $this->getDoctrine()->getRepository('AppBundle:Matchday');
  3. $matchday = $repository->getMatchday();
  4. return $matchday;
  5. }


Czy jest sens abym utworzył sobie osobną klasę z jedną poniższą metodą i zapisał ją w kontenerze usług a później wywoływał w róźnych akcjach kontrolera ?
  1. services:
  2. current_matchday:
  3. class: AppBundle\Utils\CurrentMatchday


Czy może źle się do tego zabieram ?

Będę wdzięczny za podpowiedź.
Rysh
Dlaczego nie zrobisz sobie nowego controllera którego będziesz po prostu dziedziczył ?
damianooo
Chyba nie do końca jasno napisałem o co mi chodzi.
Mój problem wydaje się że nie ma nic wspólnego z kontenerem usług.

Potrzebuję na każdej podstronie mojego serwisu wyświetlać w panelu tą samą informację (np. numer kolejki piłkarskiej w danym tygodniu)

Wydaje mi się jednak bez sensu wywoływać tą samą metodę w każdej akcji kontrolera - dlatego kombinuję jak to ugryźć.

Najlepszym rozwiązaniem byłoby chyba abym w głównym szablonie (base.html.twig) w sekcji np. info {% block info %} wyświetlać dane pobrane tą metodą.

Jak tylko przekazać dane do szablonu base.html.twig ?
A może inaczej to powinienem zrobić ?

ohm
Tworzysz twig extension, jeśli potrzebujesz to dorzucasz jej doctrine'a, definiujesz tam nową funkcję którą możesz użyć w dowolnym szablonie twiga.
http://symfony.com/doc/current/templating/..._extension.html - tu akurat masz Filter, ale tak samo tworzy się Function.
damianooo
To jest chyba dokładnie to czego potrzebuję.
Poczytałem trochę o tym i zaimplemenowałem w moim projekcie jednak chyba czegoś brakuje w mojej klasie albo źle się odwołuję do mojej funkcji ponieważ mam następujący błąd:

  1. Variable "curr_matchday" does not exist in app/Resources/views/base.html.twig at line 25.


Mój TwigExtension wygląda tak:

  1. namespace AppBundle\Twig;
  2.  
  3. class AppExtension extends \Twig_Extension {
  4. public function getFunctions()
  5. {
  6. return array(
  7. new \Twig_SimpleFunction('curr_matchday', array($this, 'getCurrentMatchday')),
  8. );
  9. }
  10.  
  11. public function getCurrentMatchday(){
  12. $repository = $this->getDoctrine()->getRepository('AppBundle:Matchday');
  13. $matchday = $repository->getMatchday();
  14. return $matchday;
  15. }
  16. }


services.yml :

  1. services:
  2. app.twig_extension:
  3. class: AppBundle\Twig\AppExtension
  4. public: false
  5. tags:
  6. - { name: twig.extension }


wywołanie funkcji w base.html.twig mam takie:

  1. {% block info %}
  2. {{ curr_matchday.name }}
  3. {% endblock %}



ohm
To jest funkcja, więc wywołujesz ją jako funkcję po prostu, czyli
  1. {{ curr_matchday() }}


i tyle smile.gif
damianooo
ok działa ... dzięki ohm ... brakowało mi jednak Doctrina i w serwisach argumentu:
  1. use Symfony\Bridge\Doctrine\RegistryInterface;
  2.  
  3. ...
  4.  
  5. protected $doctrine;
  6.  
  7. public function __construct(RegistryInterface $doctrine)
  8. {
  9. // if you want to do queries execute : $this->doctrine->getManager();
  10. $this->doctrine = $doctrine;
  11. }


services.yml

  1. app.twig_extension:
  2. class: AppBundle\Twig\AppExtension
  3. public: false
  4. arguments:
  5. doctrine : '@doctrine'


a w base.html.twig wywołanie :
  1. {% block info %}
  2. {{ curr_matchday().name }}
  3. {{ curr_matchday().dateFrom|date('d-m-Y') }}
  4. {{ curr_matchday().dateTo|date('d-m-Y') }}
  5. {% endblock %}

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-2024 Invision Power Services, Inc.