Completed
Push — master ( dab245...a7b618 )
by Gaetano
13:10 queued 08:59
created

Repository::setLogger()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Kaliop\eZObjectWrapperBundle\Core;
4
5
use eZ\Publish\API\Repository\Repository as eZRepository;
6
use eZ\Publish\API\Repository\Values\Content\Location;
7
use eZ\Publish\API\Repository\Values\Content\Content;
8
use eZ\Publish\API\Repository\Values\Content\ContentInfo;
9
use eZ\Publish\API\Repository\Values\Content\Search\SearchResult;
10
use Psr\Log\LoggerInterface;
11
12
/**
13
 * Typehint methods we expose from Logger and Repository using magic calls. NB: to be adjusted manually if those change...
14
 *
15
 * @method null emergency($message, array $context = array())
16
 * @method null alert($message, array $context = array())
17
 * @method null critical($message, array $context = array())
18
 * @method null error($message, array $context = array())
19
 * @method null warning($message, array $context = array())
20
 * @method null notice($message, array $context = array())
21
 * @method null info($message, array $context = array())
22
 * @method null debug($message, array $context = array())
23
 * @method null log($message, array $context = array())
24
 *
25
 * @method \eZ\Publish\API\Repository\ContentService getContentService()
26
 * @method \eZ\Publish\API\Repository\LanguageService getContentLanguageService()
27
 * @method \eZ\Publish\API\Repository\ContentTypeService getContentTypeService()
28
 * @method \eZ\Publish\API\Repository\LocationService getLocationService()
29
 * @method \eZ\Publish\API\Repository\TrashService getTrashService()
30
 * @method \eZ\Publish\API\Repository\SectionService getSectionService()
31
 * @method \eZ\Publish\API\Repository\SearchService getSearchService()
32
 * @method \eZ\Publish\API\Repository\UserService getUserService()
33
 * @method \eZ\Publish\API\Repository\URLAliasService getURLAliasService()
34
 * @method \eZ\Publish\API\Repository\URLWildcardService getURLWildcardService()
35
 * @method \eZ\Publish\API\Repository\ObjectStateService getObjectStateService()
36
 * @method \eZ\Publish\API\Repository\RoleService getRoleService()
37
 * @method \eZ\Publish\API\Repository\FieldTypeService getFieldTypeService()
38
 *
39
 * @method \eZ\Publish\API\Repository\Values\User\User getCurrentUser()
40
 * @method null setCurrentUser(\eZ\Publish\API\Repository\Values\User\User $user)
41
 * @method array|null hasAccess($module, $function, \eZ\Publish\API\Repository\Values\User\User $user = null)
42
 * @method bool canUser($module, $function, \eZ\Publish\API\Repository\Values\ValueObject $object, $targets = null)
43
 *
44
 * @method null beginTransaction()
45
 * @method null commit()
46
 * @method null rollback()
47
 *
48
 * @todo we could add simple methods like findAll() and fetch($offset, $limit) which simply filter based on contentType
49
 */
50
class Repository implements RepositoryInterface
51
{
52
    // Name of the php class used to create entities. Subclasses have to set a value to this, to be able to create entities
53
    protected $entityClass;
54
55
    protected $repository;
56
    protected $entityManager;
57
    protected $contentTypeIdentifier;
58
    protected $settings;
59
    protected $logger;
60
61 10
    public function __construct(eZRepository $repository, $entityManager, array $settings=array(), $contentTypeIdentifier='')
62
    {
63 10
        $this->repository = $repository;
64 10
        $this->entityManager = $entityManager;
65 10
        $this->settings = $this->validateSettings($settings);
66 10
        $this->contentTypeIdentifier = $contentTypeIdentifier;
67 10
    }
68
69 10
    public function setContentTypeIdentifier($contentTypeIdentifier)
70
    {
71 10
        $this->contentTypeIdentifier = $contentTypeIdentifier;
72 10
        return $this;
73
    }
74
75
    public function setSettings(array $settings)
76
    {
77
        $this->settings = $this->validateSettings($settings);
78
        return $this;
79
    }
80
81 10
    public function setLogger(LoggerInterface $logger=null)
82
    {
83 10
        $this->logger = $logger;
84 10
        return $this;
85
    }
86
87
    /**
88
     * Called from the constructor, with the settings received from the caller.
89
     * Subclasses can implement checking here, or merge the received settings with other data, using f.e. the Symfony
90
     * OptionsResolver component (see http://symfony.com/doc/current/components/options_resolver.html).
91
     *
92
     * @param array $settings
93
     * @return array
94
     */
95 10
    protected function validateSettings(array $settings)
96
    {
97 10
        return $settings;
98
    }
99
100
    /**
101
     * Nice syntactic sugar ( manually typehinted :-) )
102
     * Allow all logger methods and eZ repo methods to be called on this extended repo
103
     *
104
     * @param string $method
105
     * @param array $args
106
     * @return mixed
107
     *
108
     * @todo !important move this method to protected access?
109
     */
110 10
    public function __call($method, $args)
111
    {
112
        switch($method) {
113 10
            case 'emergency':
114 10
            case 'alert':
115 10
            case 'critical':
116 10
            case 'error':
117 10
            case 'warning':
118 10
            case 'notice':
119 10
            case 'info':
120 10
            case 'debug':
121 10
            case 'log':
122
                if ($this->logger) {
123
                    return call_user_func_array(array($this->logger, $method), $args);
124
                }
125
                // if no logger is defined, swallow the method call
126
                return;
127 10
            default:
128 10
                return call_user_func_array(array($this->repository, $method), $args);
129 10
        }
130
    }
131
132
    /**
133
     * To be overridden in subclasses, this method allows injecting extra services/settings in the entities created.
134
     * This version 'knows' about EntityManagerAware and Logging entity traits.
135
     *
136
     * @param \Kaliop\eZObjectWrapperBundle\Core\EntityInterface $entity
137
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
138
     */
139 10
    protected function enrichEntityAtLoad($entity)
140
    {
141 10
        if (is_callable(array($entity, 'setLogger'))) {
142
            $entity->setLogger($this->logger);
143
        }
144 10
        if (is_callable(array($entity, 'setEntityManager'))) {
145 10
            $entity->setEntityManager($this->entityManager);
146 10
        }
147 10
        return $entity;
148
    }
149
150
    /**
151
     * @param Content $content
152
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
153
     *
154
     * @todo optionally (?) throw an error if bad content type is detected
155
     */
156 10
    public function loadEntityFromContent(Content $content)
157
    {
158 10
        $class = $this->entityClass;
159 10
        $entity = new $class($this->repository, $content, null);
160 10
        return $this->enrichEntityAtLoad($entity);
161
    }
162
163
    /**
164
     * @param Location $location
165
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
166
     */
167 4
    public function loadEntityFromLocation(Location $location)
168
    {
169 4
        $class = $this->entityClass;
170 4
        $entity = new $class($this->repository, null, $location);
171 4
        return $this->enrichEntityAtLoad($entity);
172
    }
173
174
    /**
175
     * @param ContentInfo $contentInfo
176
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
177
     */
178 2
    public function loadEntityFromContentInfo(ContentInfo $contentInfo)
179
    {
180 2
        return $this->loadEntityFromContent($this->getContentService()->loadContentByContentInfo($contentInfo));
181
    }
182
183
    /**
184
     * @param int $id
185
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
186
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
187
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the user has no access to read content and in case of un-published content: read versions
188
     */
189 10
    public function loadEntityFromContentId($id)
190
    {
191 10
        return $this->loadEntityFromContent($this->getContentService()->loadContent($id));
192
    }
193
194
    /**
195
     * An alias for loadEntityFromContentId, to keep the API close to Doctrine
196
     * @param int $id
197
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
198
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
199
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the user has no access to read content and in case of un-published content: read versions
200
     */
201 10
    public function find($id)
202
    {
203 10
        return $this->loadEntityFromContentId($id);
204
    }
205
206
    /**
207
     * @param int $id
208
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
209
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location
210
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found
211
     */
212 1
    public function loadEntityFromLocationId($id)
213
    {
214 1
        return $this->loadEntityFromLocation($this->getLocationService()->loadLocation($id));
215
    }
216
217
    /**
218
     * @param string $remoteId
219
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
220
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
221
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the user has no access to read content and in case of un-published content: read versions
222
     */
223 1
    public function loadEntityFromContentRemoteId($remoteId)
224
    {
225 1
        return $this->loadEntityFromContent($this->getContentService()->loadContentByRemoteId($remoteId));
226
    }
227
228
    /**
229
     * @param string $remoteId
230
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
231
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location
232
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found
233
     */
234 1
    public function loadEntityFromLocationRemoteId($remoteId)
235
    {
236 1
        return $this->loadEntityFromLocation($this->getLocationService()->loadLocationByRemoteId($remoteId));
237
    }
238
239
    /**
240
     * NB: assumes that all search results are homogeneous (same content type)
241
     * @param SearchResult $searchResult
242
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface[]
243
     */
244
    protected function loadEntitiesFromSearchResults(SearchResult $searchResult)
245
    {
246
        $entities = array();
247
        foreach ($searchResult->searchHits as $searchHit) {
248
            // let's hope that in the future eZPublish does not add new types of results to SearchResult... :-P
249
            if ($searchHit->valueObject instanceof \eZ\Publish\API\Repository\Values\Content\Location) {
250
                $entities[] = $this->loadEntityFromLocation($searchHit->valueObject);
251
            } else {
252
                $entities[] = $this->loadEntityFromContent($searchHit->valueObject);
0 ignored issues
show
Compatibility introduced by
$searchHit->valueObject of type object<eZ\Publish\API\Re...ory\Values\ValueObject> is not a sub-type of object<eZ\Publish\API\Re...Values\Content\Content>. It seems like you assume a child class of the class eZ\Publish\API\Repository\Values\ValueObject to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
253
            }
254
        }
255
        return $entities;
256
    }
257
}
258