Привет!
Сказу скажу, что приведенные примеры кода - абстрактные, но помогающие понять проблему, с которой я столкнулся.
Есть контроллер, которые вызывает метод у какого-то сервиса:
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 - это внешний сервис, на который я повлиять не могу, и в котором интересующие меня данные пользователя хранятся в разных столбцах таблицы в зависимости от группы пользователя.