我有一个Provider类,并装饰了一个CacheProviderDecorator类。 麻烦的是我需要缓存method的结果,该结果在其他提供者的方法内部被调用:
例如,在提供程序类中:
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()
内部使用,因此我必须从Provider复制getUsers()
方法,否则将始终调用Provider的getUsers()
,而Provider的getUser()
也是如此(由于$ this->)。
有很多这样的重复。有什么好的建筑解决方案吗?