protected function doAction(MvcEvent $event, $metadata, $documentManager) { $options = $event->getTarget()->getOptions(); if (!($document = $event->getParam('document'))) { // document not set, so load it $document = $documentManager->createQueryBuilder()->find($metadata->name)->field($options->getProperty())->equals($event->getParam('id'))->getQuery()->getSingleResult(); if (!$document) { throw new Exception\DocumentNotFoundException(); } } $result = new Result($document); if (isset($metadata->stamp['updatedOn'])) { $lastModified = new LastModified(); $lastModified->setDate($metadata->getFieldValue($document, $metadata->stamp['updatedOn'])); $result->addHeader($lastModified); } $result->addHeader($options->getCacheControl()); $event->setResult($result); return $result; }
public function getList(MvcEvent $event) { $options = $event->getTarget()->getOptions(); $documentManager = $options->getModelManager(); $metadata = $documentManager->getClassMetadata($options->getClass()); if ($list = $event->getParam('list')) { $list = $list->getValues(); } unset($this->range); $criteria = $this->getCriteria($event); //filter list on criteria if (count($criteria) > 0 && $list) { $list = $this->applyCriteriaToList($list, $criteria, $metadata); } if ($list) { $total = count($list); } else { //load the total from the db $totalQuery = $documentManager->createQueryBuilder()->find($metadata->name); $total = $this->addCriteriaToQuery($totalQuery, $criteria, $metadata, $documentManager)->getQuery()->execute()->count(); } if ($total == 0) { $result = new Result([]); $result->setStatusCode(204); $event->setResult($result); return $result; } $offset = $this->getOffset($event); if ($offset > $total - 1) { throw new Exception\BadRangeException(); } $sort = $this->getSort($event); if ($list) { //apply any required sort to the result if (count($sort) > 0) { $this->applySortToList($list, $sort, $metadata); } $list = array_slice($list, $offset, $this->getLimit($event)); } else { $resultsQuery = $documentManager->createQueryBuilder()->find($metadata->name); $this->addCriteriaToQuery($resultsQuery, $criteria, $metadata, $documentManager); $resultsQuery->limit($this->getLimit($event))->skip($offset); $list = $this->addSortToQuery($resultsQuery, $sort)->eagerCursor(true)->getQuery()->execute(); } $max = $offset + count($list) - 1; $result = new Result($list); $result->addHeader(ContentRange::fromString("Content-Range: {$offset}-{$max}/{$total}")); $event->setResult($result); return $result; }