Completed
Push — master ( a7b618...f88368 )
by Gaetano
07:43
created

Repository::loadEntityFromContentAndLocation()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 0
cts 0
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 2
crap 2
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
     * This method is useful f.e. when you want to create an Entity that matches a given version and specific location.
176
     * This happens notably when doing content previews, where eZ will inject into your controllers both of them.
177
     *
178 2
     * @param Content $content
179
     * @param Location $location
180 2
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
181
     */
182
    public function loadEntityFromContentAndLocation(Content $content, Location $location)
183
    {
184
        $class = $this->entityClass;
185
        $entity = new $class($this->repository, $content, $location);
186
        return $this->enrichEntityAtLoad($entity);
187
    }
188
189 10
    /**
190
     * @param ContentInfo $contentInfo
191 10
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
192
     */
193
    public function loadEntityFromContentInfo(ContentInfo $contentInfo)
194
    {
195
        return $this->loadEntityFromContent($this->getContentService()->loadContentByContentInfo($contentInfo));
196
    }
197
198
    /**
199
     * @param int $id
200
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
201 10
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
202
     * @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
203 10
     */
204
    public function loadEntityFromContentId($id)
205
    {
206
        return $this->loadEntityFromContent($this->getContentService()->loadContent($id));
207
    }
208
209
    /**
210
     * An alias for loadEntityFromContentId, to keep the API close to Doctrine
211
     * @param int $id
212 1
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
213
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
214 1
     * @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
215
     */
216
    public function find($id)
217
    {
218
        return $this->loadEntityFromContentId($id);
219
    }
220
221
    /**
222
     * @param int $id
223 1
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
224
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location
225 1
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found
226
     */
227
    public function loadEntityFromLocationId($id)
228
    {
229
        return $this->loadEntityFromLocation($this->getLocationService()->loadLocation($id));
230
    }
231
232
    /**
233
     * @param string $remoteId
234 1
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
235
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content with the given id does not exist
236 1
     * @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
237
     */
238
    public function loadEntityFromContentRemoteId($remoteId)
239
    {
240
        return $this->loadEntityFromContent($this->getContentService()->loadContentByRemoteId($remoteId));
241
    }
242
243
    /**
244
     * @param string $remoteId
245
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface
246
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location
247
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found
248
     */
249
    public function loadEntityFromLocationRemoteId($remoteId)
250
    {
251
        return $this->loadEntityFromLocation($this->getLocationService()->loadLocationByRemoteId($remoteId));
252
    }
253
254
    /**
255
     * NB: assumes that all search results are homogeneous (same content type)
256
     * @param SearchResult $searchResult
257
     * @return \Kaliop\eZObjectWrapperBundle\Core\EntityInterface[]
258
     */
259
    protected function loadEntitiesFromSearchResults(SearchResult $searchResult)
260
    {
261
        $entities = array();
262
        foreach ($searchResult->searchHits as $searchHit) {
263
            // let's hope that in the future eZPublish does not add new types of results to SearchResult... :-P
264
            if ($searchHit->valueObject instanceof \eZ\Publish\API\Repository\Values\Content\Location) {
265
                $entities[] = $this->loadEntityFromLocation($searchHit->valueObject);
266
            } else {
267
                $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...
268
            }
269
        }
270
        return $entities;
271
    }
272
}
273