
06 Lut Symfony 4 Autowiring i Service Container
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

Dziękuję, że się zapisałeś!
Sprawdź swoją skrzynkę mailową, do kilku minut otrzymasz ode mnie wiadomość. Jeśli jej nie znajdziesz, sprawdź SPAM.