fbpx

Symfony 4 Autowiring i Service Container

Symfony 4 Autowiring i Service Container

Poziom zaawansowania:
2/5

Jakiś czas temu na Waszą prośbę pisałam o tym jak dział Serwice Container w Symfony 3 i jak z niego korzystać. Wtedy za każdym razem, kiedy chcieliśmy, aby klasa była dostępna w kontenerze musieliśmy świadomie dać znać systemowi, że ta klasa jest serwisem i ma być dostępna na takich warunkach. Jeśli posiadała dodatkowe zależności również musieliśmy je określić.

W przypadku Symfony 4 nastąpiła mała rewolucja. Zmieniono podejście o prawie 180 stopni. Teraz każda klasa jest serwisem i nie musimy jej rejestrować w żaden sposób. Nazywa się to Autowiringiem. Oczywiście możemy tę opcje świadomie wyłączyć. Wtedy wracamy to działania jak w SF3.

Czym jest Service Container?

Mówiąc najprościej jest to narzędzie do zarządzania zależnościami między klasami w systemie. Dzięki niemu możemy świadomie sterować, która klasa jest powiązana z którą i wstrzykiwać je wzajemnie w siebie. Zasada między wersjami Symfony jest taka sama, jak to zrobić możesz przeczytać tutaj.

Service Container jest szeroko wykorzystywany w wielu systemach tj. Symfony czy Laravel.

Autowiring

Autowiring jest domyślnie włączoną funkcją w Symfony 4+. Możemy to oczywiście zmienić poprzez ustawienie flagi z false w pliku config/services.yaml

services:
     _defaults:
         autowire: true
         autoconfigure: true
         public: false

To ustawienie można zmienić zarówno dla zawartości pliku w bundlu, jeśli z nich korzystamy lub przenosimy paczkę ze starszej wersji i nie chcemy przepisywać serwisów. Możliwa jest również zmiana tej flagi dla jednego serwisu np. kiedy mamy wyłączony autowriting a dla tej jednej klasy chcemy go włączyć.

App\Service\HttpClient:
         autowire: true

Kiedy jednak nie typujemy zmiennej w konstruktorze na konkretną klasę, tylko na typ podstawowy lub interfejs, wtedy będzie potrzebna już nasza ręczna interwencja i napisanie, czego dokładnie w tej zmiennej oczekujemy.

W przypadku używania interfejsów wystarczy, że po ich zastosowaniu w pliku services.yaml zostawimy informację, która klasa ma być wstrzyknięta w miejsce tego interfejsu

App\Service\ClientInterface: '@App\ Service \HttpClient’

Kiedy do konstruktora wstrzykujemy zmienną np. typu string, to żeby nie wypisywać wszystkich innych zależności możemy zdefiniować tylko ją jako argument, a reszta zostanie uzupełniona automatycznie. Aby to zrobić wystarczy zapis:

parameters:
     mailer_user: '%env(MAILER_USER)%'
  
     App\Service\ContactService:
         arguments:
             $mailerUser: '%mailer_user%'

Zgarnij darmowy ebook i cotygodniową dawkę wiedzy

.
Tags:
,
Magdalena Limanówka-Kuciel
magdalena@panizkomputerem.pl

Jestem programistką, która lubi mieć ręce pełne roboty. Do życia potrzebuje komputera z internetem i kubka gorącej kawy. Więcej na stronie o mnie.