EasyCacheTrait::_getCacheKey()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
namespace App\Traits;
4
5
use Illuminate\Support\Facades\Input;
6
use Illuminate\Support\Facades\Cache;
7
use Illuminate\Support\Facades\Log;
8
9
trait EasyCacheTrait
10
{
11
    /**
12
     * default expire time (min)
13
     * @var int
14
     */
15
    private $default_expire = 60;
16
17
    /**
18
     * cache through __call
19
     * @param $method
20
     * @param $parameters
21
     * @return mixed
22
     */
23
    public function __call($method, $parameters)
24
    {
25
        $cacheKey = self::_getCacheKey($method, $parameters);
26
        $expire = $this->getExpire($method);
27
        $closure = function () use ($method, $parameters) {
28
            return call_user_func_array([$this, $method], $parameters);
29
        };
30
        try {
31
            if (config('app.debug') && Input::get('skipCache')) {
32
                return $closure();
33
            }
34
            if (config('app.debug') && Input::get('forgetCache')) {
35
                Cache::forget($cacheKey);
36
            }
37
            //do not cache when expire is empty
38
            if ($expire) {
39
                $result = Cache::remember($cacheKey, $expire, $closure);
40
                return $result;
41
            } else {
42
                return $closure();
43
            }
44
        } catch (\Throwable $throwable) {
45
            Log::error($throwable);
46
            return $closure();
47
        }
48
    }
49
50
    /**
51
     * get expire time by reflection
52
     * @param $method
53
     * @return int
54
     */
55
    private function getExpire($method)
56
    {
57
        $rf = new \ReflectionMethod($this, $method);
58
        $staticVar = $rf->getStaticVariables();
59
        if (array_key_exists('expire', $staticVar)) {
60
            $expire = $staticVar['expire'];
61
        } else {
62
            $expire = $this->default_expire;
63
        }
64
        return $expire;
65
    }
66
67
    /**
68
     * delete all cache from the class
69
     * @return bool
70
     */
71 View Code Duplication
    public function forgetCache()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
72
    {
73
        $cacheName = self::_getCacheKeyPrefixLevel1() . '*';
74
        $redis = Cache::getRedis();
75
        $keys = $redis->keys($cacheName);
76
        if ($keys) {
77
            $redis->del($keys);
78
        };
79
        return true;
80
    }
81
82
    /**
83
     * delete all cache from method
84
     * @param $method
85
     * @return bool
86
     */
87 View Code Duplication
    public function forgetMethodCache($method){
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
88
        $cacheName = self::_getCacheKeyPrefixLevel2($method) . '*';
89
        $redis = Cache::getRedis();
90
        $keys = $redis->keys($cacheName);
91
        if ($keys) {
92
            $redis->del($keys);
93
        };
94
        return true;
95
    }
96
97
    /**
98
     * get cache level1 prefix
99
     * @return string
100
     */
101
    private static function _getCacheKeyPrefixLevel1(){
102
        return __CLASS__ . ":";
103
    }
104
105
    /**
106
     * get cache level2 prefix
107
     * @param $method
108
     * @return string
109
     */
110
    private static function _getCacheKeyPrefixLevel2($method){
111
        return self::_getCacheKeyPrefixLevel1() . $method . ":";
112
    }
113
114
    /**
115
     * get cache key
116
     * @param $method
117
     * @param $params
118
     * @return string
119
     */
120
    private static function _getCacheKey($method, $params){
121
        return self::_getCacheKeyPrefixLevel2($method) . md5(json_encode($params));
122
    }
123
124
125
}