Дублирование кода при использовании Cache с шаблоном Decorator - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть класс 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 ->).

Существует множество таких повторений. Есть ли хорошее архитектурное решение?

...