Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony2][SF2][SF] - Kontener usług, Czy w tym przypadku powinienem stworzyć nowy serwis ?
damianooo
post
Post #1





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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ź.

Ten post edytował damianooo 17.03.2017, 22:59:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Rysh
post
Post #2





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


Dlaczego nie zrobisz sobie nowego controllera którego będziesz po prostu dziedziczył ?
Go to the top of the page
+Quote Post
damianooo
post
Post #3





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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ć ?

Go to the top of the page
+Quote Post
ohm
post
Post #4





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

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


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.
Go to the top of the page
+Quote Post
damianooo
post
Post #5





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 %}



Go to the top of the page
+Quote Post
ohm
post
Post #6





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

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


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


i tyle (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
damianooo
post
Post #7





Grupa: Zarejestrowani
Postów: 496
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


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 %}

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 14:11