У меня есть класс Provider и один украшающий класс CacheProviderDecorator. Проблема в том, что мне нужно кэшировать результат метода, который вызывается внутри метода другого провайдера:
Например, в классе провайдера:
public function getUser(int $id): array
{
return json_decode($this->client->get('user/' . $id)->getBody()->getContents(), true);
}
public function getUsers(array $usersIds): array
{
$usersSurnames = new Collection();
foreach ($usersIds as $userId) {
$usersSurnames->push($this->getUser($userId)['surname']);
}
return $usersSurnames->toArray();
}
Класс CacheProviderDecorator:
public function getUser(int $id): array
{
$key = self::PROJECT_USER . '_' . $id;
return $this->cache->remember($key, self::TTL, function () use ($id) {
return $this->provider->getUser($id);
});
}
И поскольку getUser()
используется только внутри getUsers()
, мне нужно продублировать getUsers()
метод из Provider, иначе всегда будет вызываться getUsers()
поставщика, а затем getUser()
поставщика. (из-за $ this ->).
Существует множество таких повторений. Есть ли хорошее архитектурное решение?