Kiedy rozpoczynamy pracę z frameworkiem Symfony, jednym z kluczowych elementów, z którymi się zapoznajemy, jest system serwisów i Dependency Injection (DI). W tym wpisie omówimy zaawansowane techniki korzystania z serwisów i DI w Symfony, poparte konkretnymi przykładami.
1. Własne tagi serwisów
Załóżmy, że mamy kilka serwisów obsługujących różne formaty obrazów. Możemy otagować te serwisy, aby łatwiej je zarządzać.
# config/services.yaml
services:
App\ImageProcessor\JpegProcessor:
tags:
- { name: 'image.processor', format: 'jpeg' }
App\ImageProcessor\PngProcessor:
tags:
- { name: 'image.processor', format: 'png' }
2. Lazy Services
Jeśli mamy serwis, który jest kosztowny w inicjalizacji, ale nie zawsze jest używany, możemy oznaczyć go jako „lazy”.
# config/services.yaml
services:
App\HeavyService:
lazy: true
Dzięki temu serwis App\HeavyService
zostanie zainicjowany tylko wtedy, gdy faktycznie będzie potrzebny.
3. Factory Method dla serwisów
Przyjmijmy, że mamy serwis, który chcemy inicjować za pomocą statycznej metody fabrycznej.
# config/services.yaml
services:
App\Service\CustomService:
factory: ['App\Service\CustomServiceFactory', 'createInstance']
W tym przypadku serwis App\Service\CustomService
będzie tworzony przy użyciu metody createInstance
z klasy App\Service\CustomServiceFactory
.
4. Dekoratory serwisów
Załóżmy, że chcemy modyfikować działanie istniejącego serwisu, dodając dodatkowe logowanie.
# config/services.yaml
services:
App\Service\OriginalService:
decorates: 'App\OriginalService'
arguments: ['@App\Service\OriginalService.inner']
App\OriginalService: ~
Kiedy kod odwołuje się do App\OriginalService
, faktycznie korzysta z naszego dekoratora App\Service\OriginalService
, który ma dostęp do oryginalnego serwisu jako .inner
.
Podsumowanie
System serwisów i Dependency Injection w Symfony to potężne narzędzia, które pozwalają tworzyć elastyczne i skalowalne aplikacje. Dzięki konkretnym przykładom łatwiej jest zrozumieć, jak te zaawansowane techniki mogą być stosowane w praktyce.