Esempio n. 1
0
 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;
 }