в реквесте в action контроллера. Исходя из него вызываются различные сервисы которые автовайрятся внутри контроллера, все покрыты одним интерфейсом. То есть по коду есть switch c кучей case в которых идет вызов типа
case 'some_type1':
$this->serviceA->execute().
case 'some_type2':
$this->serviceB->execute().
Нормально будет если сделать парам конвертор который подставит нужный сервис? Что делать в конвертере? не хотелось бы просто перенести этот switch case. Все нужные сервисы уже как бы есть в контейнере, их не надо заново создавать, а только определиться какой взять.
медиатор?
хмм.. Даже не вспомнил, сейчас освежу в памяти
Symfony-Way interface SomeServiceInterface { public function execute(BaseType $obj): void; public function supports(BaseType $obj): bool; } class SomeService { private iterable $services; public function __construct(iterable $services) { $this->services = $services; // можно чекнуть тип каждого сервиса, что это SomeServiceInterface } public function execute(BaseType $obj): void { foreach ($this->services as $service) { if ($service->supports($obj)) { $service->execute($obj); return; } } } } дальше пилишь свои сервисы А и Б, вешаешь на них теги и по тегам инжектишь в SomeService
Человечачее вам спасибо.
как называется такой подход ? и есть ли у него в обще название
я хз, теорию не шарю =) это крайне похоже на фабрику имхо, когда по базовому типу получил бы конкретный сервис, с той лишь разницей, что сервисы все инстанциированы и новый не создается
Chain of responsibility)
не совсем... в цепи каждый елемент обраабывает контекст (если может) и прокидывает дальше. Здесь же только один елемент выберется и он сделает работу
если тот единственный, который выбрался - прокинет дальше?
Обсуждают сегодня