Ленивая загрузка сервисов в Symfony. Зачем нужны ленивые сервисы.

Для чего нужна ленивая загрузка сервисов?

В некоторых случаях вы можете захотеть внедрить сервис, который немного тяжело создать, но не всегда используется внутри вашего объекта. Например, представьте, что у вас есть NewsletterManager и вы внедряете в него сервис Mailer. Только несколько методов вашего NewsletterManager фактически используют сервис Mailer, но даже когда вам это не нужно, всегда создается объект сервиса Mailer при создании вашего NewsletterManager.

Настройка ленивых сервисов — один из ответов на этот вопрос. В случае настройки сервиса Mailer как ленивого, то фактически будет внедряться «прокси»-сервис. Он выглядит и действует так же, как сервис Mailer, за исключением того, что Mailer на самом деле не создается, пока вы каким-то образом не взаимодействуете с проксирующим его сервисом «proxy«.

Установка пакета для ленивых сервисов.

Для того, чтобы использовать создание отложенных сервисов, вам нужно установить пакет symfony/proxy-manager-bridge:

 composer require symfony/proxy-manager-bridge

Настройка ленивого сервиса в services.yaml

Вы можете пометить сервис как ленивый, когда определяете в файле services.yaml:

# config/services.yaml
services:
    App\Twig\AppExtension:
        lazy: true

После внедрения сервиса в другой сервис, необходимо внедрить виртуальный прокси с той же сигнатурой класса, представляющего сервис, для которого объявляем ленивую загрузку. То же самое происходит при прямом вызове Container::get().

Фактический объект класса нужного сервиса будет создан, только когда вы попытаетесь взаимодействовать с этим сервисом (например, вызовите один из его методов).

Чтобы проверить, работает ли ваш прокси, вы можете проверить интерфейс полученного объекта:

dump(class_implements($service));
// the output should include "ProxyManager\Proxy\LazyLoadingInterface"

Если в проекте Symfony не будет установлен ProxyManager bridge и ocramius/proxy-manager, то сервис-контейнер Symfony пропустит объявление lazy: true и напрямую создаст экземпляр сервиса, как обычно.

Добавить комментарий

Ваш адрес email не будет опубликован.