@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...

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

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

Похожие вопросы