Zaawansowane zastosowania serwisów i Dependency Injection w Symfony

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.

Dołącz do Newslettera! Co tydzień świeże newsy ze świata PHP

X