Задать вопрос
@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 - это внешний сервис, на который я повлиять не могу, и в котором интересующие меня данные пользователя хранятся в разных столбцах таблицы в зависимости от группы пользователя.
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
uDenX
@uDenX
PHP Developer
https://github.com/symfony/symfony/blob/6.0/src/Sy...
https://designpatternsphp.readthedocs.io/ru/latest...

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽