Completed
Push — master ( a69dc8...f2f723 )
by Franck
11:05
created

Pool::hasItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
/**
4
 *
5
 * This file is part of the Apix Project.
6
 *
7
 * (c) Franck Cassedanne <franck at ouarz.net>
8
 *
9
 * @license     http://opensource.org/licenses/BSD-3-Clause  New BSD License
10
 *
11
 */
12
13
namespace Apix\Cache\PsrCache;
14
15
use Apix\Cache\Adapter as CacheAdapter;
16
use Psr\Cache\CacheItemInterface as ItemInterface;
17
use Psr\Cache\CacheItemPoolInterface as ItemPoolInterface;
18
19
class Pool implements ItemPoolInterface
20
{
21
22
    /**
23
     *
24
     * @var CacheAdapter
25
     */
26
    protected $cache_adapter;
27
28
    /**
29
     * Deferred cache items to be saved later.
30
     *
31
     * @var array   Collection of \Apix\PsrCache\Item.
32
     */
33
    protected $deferred = array();
34
35
    /**
36
     * Constructor.
37
     */
38 221
    public function __construct(CacheAdapter $cache_adapter)
39
    {
40 221
        $this->cache_adapter = $cache_adapter;
41
42
        $options = array(
43 221
            'prefix_key' => 'cask-key-',  // prefix cache keys
44
            'tag_enable' => false         // wether to enable tagging
45 221
        );
46 221
        $this->cache_adapter->setOptions($options);
47 221
    }
48
49
    /**
50
     * {@inheritdoc}
51
     */
52 153
    public function getItem($key)
53
    {
54 153
        $value = $this->cache_adapter->loadKey($key);
55
56 153
        return new Item(
57 153
            $this->cache_adapter->removePrefixKey($key),
58 153
            $value,
59 153
            $this->cache_adapter->getTtl($key) ?: null,
60
            (bool) $value // indicates wether it is loaded from cache or not.
61 153
        );
62
    }
63
64
    /**
65
     * {@inheritdoc}
66
     */
67 68
    public function getItems(array $keys = array())
68
    {
69 68
        $items = array();
70 68
        foreach ($keys as $key) {
71 68
            $items[$key] = $this->getItem($key);
72 68
        }
73
74 68
        return $items;
75
    }
76
77
    /**
78
     * {@inheritdoc}
79
     */
80 68
    public function hasItem($key)
81
    {
82 68
        return $this->getItem($key)->isHit();
83
    }
84
85
    /**
86
     * {@inheritdoc}
87
     */
88 34
    public function clear()
89
    {
90 34
        return $this->cache_adapter->flush(true);
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96 68
    public function deleteItems(array $keys)
97
    {
98 68
        foreach ($keys as $key) {
99 68
            $this->cache_adapter->delete($key);
100 68
        }
101
102 68
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this; (Apix\Cache\PsrCache\Pool) is incompatible with the return type declared by the interface Psr\Cache\CacheItemPoolInterface::deleteItems of type boolean.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
103
    }
104
105
    /**
106
     * {@inheritdoc}
107
     */
108 34
    public function deleteItem($key)
109
    {
110 34
        return $this->deleteItems(array($key));
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this->deleteItems(array($key)); (Apix\Cache\PsrCache\Pool) is incompatible with the return type declared by the interface Psr\Cache\CacheItemPoolInterface::deleteItem of type boolean.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
111
    }
112
113
    /**
114
     * {@inheritdoc}
115
     */
116 153
    public function save(ItemInterface $item)
117
    {
118 153
        $ttl = $item->getTtlInSecond();
119
120 153
        $item->setHit(true);
121 153
        $success = $this->cache_adapter->save(
122 153
                        $item->get(),             // value to store
123 153
                        $item->getKey(),          // its key
124 153
                        null,                     // disable tags support
125 153
                        is_null($ttl) ? 0 : $ttl  // ttl in sec or null for ever
126 153
                    );
127 153
        $item->setHit($success);
128
129 153
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this; (Apix\Cache\PsrCache\Pool) is incompatible with the return type declared by the interface Psr\Cache\CacheItemPoolInterface::save of type boolean.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
130
    }
131
132
    /**
133
     * {@inheritdoc}
134
     */
135 34
    public function saveDeferred(ItemInterface $item)
136
    {
137 34
        $this->deferred[] = $item;
138
139 34
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this; (Apix\Cache\PsrCache\Pool) is incompatible with the return type declared by the interface Psr\Cache\CacheItemPoolInterface::saveDeferred of type boolean.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
140
    }
141
142
    /**
143
     * {@inheritdoc}
144
     */
145 34
    public function commit()
146
    {
147 34
        foreach ($this->deferred as $key => $item) {
148 34
            $this->save($item);
149 34
            if ( $item->isHit() ) {
150 34
                unset($this->deferred[$key]);
151 34
            }
152 34
        }
153
154 34
        return empty($this->deferred);
155
    }
156
157
    /**
158
     * Returns the cache adapter for this pool.
159
     *
160
     * @return CacheAdapter
161
     */
162 102
    public function getCacheAdapter()
163
    {
164 102
        return $this->cache_adapter;
165
    }
166
167
}
168