@Danbka

Как сервису выбрать нужный репозиторий в рантайме?

Привет!

Сказу скажу, что приведенные примеры кода - абстрактные, но помогающие понять проблему, с которой я столкнулся.

Есть контроллер, которые вызывает метод у какого-то сервиса:

class ExampleController extends AbstractController
{
    public function index(SomeService $service)
    {
        ...
        $service->getResult('paramValue');
        ...
    }
}


Теперь сам сервис:
class SomeService
{
    public function getResult(string $param)
    {
        ...
        $epics = $this->repository->getData();
        ...
    }
}


И есть 2 репозитория, которые реализуют один интерфейс:

interface DataRepository {
    public function getData();
}

class RepositoryOne implements DataRepository {
    private $external;
    public function __construct(ExternalService $external)
    {
        $this->external = $external;
    }

    public function getData()
    {
        ...
    }
}

class RepositoryTwo implements DataRepository {
    private $external;
    public function __construct(ExternalService $external)
    {
        $this->external = $external;
    }
    public function getData()
    {
        ...
    }
}


Загвоздка в том, что сервис должен получить данные из репозитория, но из какого именно - зависит от переданного параметра $param.

Я не могу сообразить, как в таком случае инстанциировать объект нужного репозитория? Если прямо к сервисе, то в сервисе же придется инжектить и ExternalService, чтобы передать его в метод getData, о котором SomeService в общем-то не должен знать (получается высокая связность классов).

Предвкушая вопросы, что за бред тут происходит, могу сказать, что ExternalService - это внешний сервис, на который я повлиять не могу, и в котором интересующие меня данные пользователя хранятся в разных столбцах таблицы в зависимости от группы пользователя.
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
uDenX
@uDenX
PHP Developer
https://github.com/symfony/symfony/blob/6.0/src/Sy...
https://designpatternsphp.readthedocs.io/ru/latest...

Либо перекладывать выбор на сами репозитории, либо вводить новый класс, который будет выбирать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽