Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用带装饰器模式的缓存时复制代码_Php_Design Patterns_Decorator_Dry - Fatal编程技术网

Php 使用带装饰器模式的缓存时复制代码

Php 使用带装饰器模式的缓存时复制代码,php,design-patterns,decorator,dry,Php,Design Patterns,Decorator,Dry,我有一个提供程序类和装饰类,CacheProviderDecorator类。 问题是我需要缓存方法的结果,该方法在其他提供程序的方法中调用: 例如,在提供程序类中: public function getUser(int $id): array { return json_decode($this->client->get('user/' . $id)->getBody()->getContents(), true); } public fun

我有一个提供程序类和装饰类,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()
方法,否则提供者的
getUsers()
将始终被调用,提供者的
getUser()
也会被调用(因为$this->)


有很多这样的重复。有什么好的架构解决方案吗

此外,我认为不应该有任何方法不在提供者类内部执行任何请求(该部分是由另一个人编写的),也许将
getUsers()
方法移动到某个服务类中会很好?请查看该链接,其中讨论了相同的问题: