Под ваше описание подходит
Service Subscriber
Что такое "подписчик сервисов"?
Это
сервис, который получает свои зависимости в виде локатора (
https://en.wikipedia.org/wiki/Service_locator_pattern). При этом,
локатор реализует ленивую загрузку, что позволяет не создавать экземпляры сервисов без необходимости.
Когда его следует использовать?
Когда
у сервиса много зависимостей, но не все они используются им одновременно.
Примером, может служить AbstractController, который зависит от Twig, Doctrine, Router и т.д.
Очевидно, что не для каждого запроса нужен Twig (json api), и не в каждом запросе есть обращение к БД.
См.
https://github.com/symfony/symfony/blob/e1581a0937...
Как его создать?
Реализовать интерфейс ServiceSubscriber:
<?php
use Psr\Container\ContainerInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;
class SomeService
{
public function __constructor(
private ContainerInterface $container,
) {
}
public static function getSubscribedServices(): array
{
return [
ServiceFirst::class => ServiceFirst::class,
ServiceSecond::class => ServiceSecond::class,
SomeCommonService::class => SomeCommonService::class,
];
}
public function methodFirst()
{
$this->container[SomeCommonService::class]->doSomethingCommon();
$this->container[ServiceFirst::class]->doSomethingFirst();
return $this->commonMethod();
}
public function methodSecond()
{
$this->container[SomeCommonService::class]->doSomethingCommon();
$this->container[ServiceSecond::class]->doSomethingSecond();
return $this->commonMethod();
}
private function commonMethod(): string
{
// some code
return 'some string';
}
}
Однако, я соглашусь с ответами выше. В подавляющем большинстве случаев
лучше будет разбить на несколько сервисов.