"Fossies" - the Fresh Open Source Software Archive

Member "drupal-9.1.0-rc1/core/modules/jsonapi/src/JsonApiResource/Data.php" (18 Nov 2020, 4834 Bytes) of package /linux/www/drupal-9.1.0-rc1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) PHP source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "Data.php" see the Fossies "Dox" file reference documentation.

    1 <?php
    2 
    3 namespace Drupal\jsonapi\JsonApiResource;
    4 
    5 use Drupal\Component\Assertion\Inspector;
    6 use Drupal\jsonapi\Exception\EntityAccessDeniedHttpException;
    7 
    8 /**
    9  * Represents the `data` and `included` objects of a top-level object.
   10  *
   11  * @internal JSON:API maintains no PHP API. The API is the HTTP API. This class
   12  *   may change at any time and could break any dependencies on it.
   13  *
   14  * @see https://www.drupal.org/project/drupal/issues/3032787
   15  * @see jsonapi.api.php
   16  */
   17 abstract class Data implements \IteratorAggregate, \Countable {
   18 
   19   /**
   20    * Various representations of JSON:API objects.
   21    *
   22    * @var \Drupal\jsonapi\JsonApiResource\ResourceIdentifierInterface[]
   23    */
   24   protected $data;
   25 
   26   /**
   27    * The number of resources permitted in this collection.
   28    *
   29    * @var int
   30    */
   31   protected $cardinality;
   32 
   33   /**
   34    * Holds a boolean indicating if there is a next page.
   35    *
   36    * @var bool
   37    */
   38   protected $hasNextPage;
   39 
   40   /**
   41    * Holds the total count of entities.
   42    *
   43    * @var int
   44    */
   45   protected $count;
   46 
   47   /**
   48    * Instantiates a Data object.
   49    *
   50    * @param \Drupal\jsonapi\JsonApiResource\ResourceIdentifierInterface[] $data
   51    *   The resources or resource identifiers for the collection.
   52    * @param int $cardinality
   53    *   The number of resources that this collection may contain. Related
   54    *   resource collections may handle both to-one or to-many relationships. A
   55    *   to-one relationship should have a cardinality of 1. Use -1 for unlimited
   56    *   cardinality.
   57    */
   58   public function __construct(array $data, $cardinality = -1) {
   59     assert(Inspector::assertAllObjects($data, ResourceIdentifierInterface::class));
   60     assert($cardinality >= -1 && $cardinality !== 0, 'Cardinality must be -1 for unlimited cardinality or a positive integer.');
   61     assert($cardinality === -1 || count($data) <= $cardinality, 'If cardinality is not unlimited, the number of given resources must not exceed the cardinality of the collection.');
   62     $this->data = array_values($data);
   63     $this->cardinality = $cardinality;
   64   }
   65 
   66   /**
   67    * Returns an iterator for entities.
   68    *
   69    * @return \ArrayIterator
   70    *   An \ArrayIterator instance
   71    */
   72   public function getIterator() {
   73     return new \ArrayIterator($this->data);
   74   }
   75 
   76   /**
   77    * Returns the number of entities.
   78    *
   79    * @return int
   80    *   The number of parameters
   81    */
   82   public function count() {
   83     return count($this->data);
   84   }
   85 
   86   /**
   87    * {@inheritdoc}
   88    */
   89   public function getTotalCount() {
   90     return $this->count;
   91   }
   92 
   93   /**
   94    * {@inheritdoc}
   95    */
   96   public function setTotalCount($count) {
   97     $this->count = $count;
   98   }
   99 
  100   /**
  101    * Returns the collection as an array.
  102    *
  103    * @return \Drupal\Core\Entity\EntityInterface[]
  104    *   The array of entities.
  105    */
  106   public function toArray() {
  107     return $this->data;
  108   }
  109 
  110   /**
  111    * Checks if there is a next page in the collection.
  112    *
  113    * @return bool
  114    *   TRUE if the collection has a next page.
  115    */
  116   public function hasNextPage() {
  117     return (bool) $this->hasNextPage;
  118   }
  119 
  120   /**
  121    * Sets the has next page flag.
  122    *
  123    * Once the collection query has been executed and we build the entity
  124    * collection, we now if there will be a next page with extra entities.
  125    *
  126    * @param bool $has_next_page
  127    *   TRUE if the collection has a next page.
  128    */
  129   public function setHasNextPage($has_next_page) {
  130     $this->hasNextPage = (bool) $has_next_page;
  131   }
  132 
  133   /**
  134    * Gets the cardinality of this collection.
  135    *
  136    * @return int
  137    *   The cardinality of the resource collection. -1 for unlimited cardinality.
  138    */
  139   public function getCardinality() {
  140     return $this->cardinality;
  141   }
  142 
  143   /**
  144    * Returns a new Data object containing the entities of $this and $other.
  145    *
  146    * @param \Drupal\jsonapi\JsonApiResource\Data $a
  147    *   A Data object object to be merged.
  148    * @param \Drupal\jsonapi\JsonApiResource\Data $b
  149    *   A Data object to be merged.
  150    *
  151    * @return static
  152    *   A new merged Data object.
  153    */
  154   public static function merge(Data $a, Data $b) {
  155     return new static(array_merge($a->toArray(), $b->toArray()));
  156   }
  157 
  158   /**
  159    * Returns a new, deduplicated Data object.
  160    *
  161    * @param \Drupal\jsonapi\JsonApiResource\Data $collection
  162    *   The Data object to deduplicate.
  163    *
  164    * @return static
  165    *   A new merged Data object.
  166    */
  167   public static function deduplicate(Data $collection) {
  168     $deduplicated = [];
  169     foreach ($collection as $resource) {
  170       $dedupe_key = $resource->getTypeName() . ':' . $resource->getId();
  171       if ($resource instanceof EntityAccessDeniedHttpException && ($error = $resource->getError()) && !is_null($error['relationship_field'])) {
  172         $dedupe_key .= ':' . $error['relationship_field'];
  173       }
  174       $deduplicated[$dedupe_key] = $resource;
  175     }
  176     return new static(array_values($deduplicated));
  177   }
  178 
  179 }