Wpis z mikrobloga

Czy da się zrobić większy projekt w Symfony bez konfiguracji serwisów w yamlach?

W pracy wszystkie serwisy definiujemy w yml'ach, podczas gdy w prywatnych projektach nigdy nie miałem takiej potrzeby i zastanawiam się czy to jest dobra praktyka.
Jestem w stanie pracować zgodnie ze sztuką, stosując jakieś strategie czy po prostu SOLID i liczyć że autowire będzie wiedział jaką implementację w danym momencie potrzebuję? Bo w pracy takie rzeczy zawsze robię przez yml.

#php #symfony #programowanie
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Klopsztanga: Uhm, normalnie, robię klasę, wstrzykuję ją w kontrolerze czy innym serwisie, dzieje się magia i działa. Bez jakichkolwiek dodatkowych yml'i poza tymi głównymi, konfiguracyjnymi.
  • Odpowiedz
@Jurix: a to jak serwis potrzebuje zmienną konfiguracyjną, np. Robisz serwis co pobiera dane z jakiegoś API. To jak przesyłasz hosta do serwisu?

Jak masz zdefiniowane argumenty w konstuktorze to symfony sobie poradzi, ale jak potrzebujesz np. stringa z configa?
  • Odpowiedz
@Klopsztanga: Nie mówię tu o wykorzystaniu plików konfiguracyjnych, bo do tego wystarczy yml parser, a o zagadnieniach powiązanych z DI.

@nowiutki: Dokładnie tego dotyczy moje pytanie - czy jest jakaś opcja na to? Czy tylko z tego powodu niezbędne w ramach projektu jest definiowanie serwisów?
  • Odpowiedz
@Klopsztanga: Nie mówię tu o wykorzystaniu plików konfiguracyjnych, bo do tego wystarczy yml parser, a o zagadnieniach powiązanych z DI.


@Jurix: no ale nie odpowiedziałeś. Jak wstrzykniesz do serwisu typ danych jak string/integer czy array? Albo co ci wstrzyknie symfony jak typehint argumentu bedzie interfejs?
  • Odpowiedz
@Klopsztanga: Twoje pytanie sugeruje mi, że należy to zrobić przez konstruktor, nie mogę wykorzystać funkcji statycznych, tak jak opisane w https://symfony.com/doc/current/components/yaml.html#reading-yaml-contents
W pracy robimy to przez konstruktor, no ale bez definicji serwisu w yml tego nie zrobię.

W tym momencie gdy mam 1 implementację interfejsu autowire Symfony ogarnia którą klasę należy wstrzyknąć. Zadałem to pytanie właśnie z powodu niewiedzy co jeśli mam ich wiele.

Definiować należy wszystkie klasy, czy mogę
  • Odpowiedz
Definiować należy wszystkie klasy, czy mogę konfigurować wyłącznie te, gdzie potrzebuję coś wstrzyknąć?


@Jurix: no właśnie o to pytam. Jest to fajny feature zaciągnięty z Laravela gdzie klasy same się wstrzykują, ale w swojej aplikacji nie mogę pozwolić na decydowanie Symfony co ma być wstrzyknięte, więcej roboty mam, ale wtedy mam pewność że mój obiekt zostanie wrzucony do serwisu.

Ale szczerze mówiąc zdania ekspertów są podzielone, więc decyzja zależy od
  • Odpowiedz
@Jurix: da się poza wyjątkami:
- tak jak mówi @klopsztanga parametry typu loginy do API, jakieś sekrety, itp. musisz jawnie wstrzyknąć albo chociaż zdefinować korzystając z "bind" w yamlu (albo innym miejscu)
- jak masz jakieś serwisy otagowane i chcesz wszystkie otagowane wstrzyknąć to też tego z uatomatu nie zrobisz
- to samo jak masz kilka instancji danej klasy

ogólnie szkoda że nie ma do tego annotacji bo by
  • Odpowiedz
@Jurix: ogólnie mówiąc, pracując w Laravelu to nie lubię autowiring. Ciężko prześledzić logikę aplikacji, dlatego też logiczniej - ale bardzie pracochłonne - jest po prostu definicja serwisów.

Masz wtedy czarno na białym co się zadzieje.
  • Odpowiedz
@Jurix: Koledzy wyżej słusznie argumentują, ale ja mam propozycję, żebyś definiował serwisy w yamlu wtedy, gdy to jest konieczne, a dla większości zostawił autowiring. Ja dokładnie w ten sposób robię, bo to jest reguła YAGNI. Jeśli masz serwis, który nawet nie ma interfejsu, tylko jest to pojedynczą klasą (tak jak masz np repozytoria), to przecież nie będziesz definiował interfejsu na siłę? Nie bedzie Ci potrzebny, bo masz jeden konkretny obiekt.
  • Odpowiedz