On this page

Strategies

Collection

The CollectionStrategy can be used to hydrate a collection of objects with data from an array with multiple items and vice versa.

The strategy uses a hydrator to hydrate and extract data from each item of a collection.

Basic usage

The following code example shows standalone usage without adding the strategy to a hydrator.

Create and configure strategy

Create the strategy and set a hydrator and a classname for the handled object items.

$strategy = new Laminas\Hydrator\Strategy\CollectionStrategy(
    new Laminas\Hydrator\ObjectPropertyHydrator(),
    stdClass::class
);

Hydrate data

$hydrated = $strategy->hydrate([
    [
        'title'    => 'Modern Love',
        'duration' => '4:46',
    ],
    [
        'title'    => 'China Girl',
        'duration' => '5:32',
    ],
    // …
]);

echo $hydrated[1]->title; // 'China Girl'
echo $hydrated[1]->duration; // '5:32'

Extract data

// Define array with objects
$track1           = new stdClass();
$track1->title    = 'Modern Love';
$track1->duration = '4:46';

$track2           = new stdClass();
$track2->title    = 'China Girl';
$track2->duration = '5:32';

$data = [
    $track1,
    $track2,
];

// Extract
$extracted = $strategy->extract($data);

var_dump($extracted);
/*
array(2) {
  [0] =>
  array(2) {
    'title' =>
    string(11) "Modern Love"
    'duration' =>
    string(4) "4:46"
  }
  [1] =>
  array(2) {
    'title' =>
    string(10) "China Girl"
    'duration' =>
    string(4) "5:32"
  }
}
*/

Example

The following example shows the hydration for a class with a property that consumes array of classes.

An example class which represents a music album with tracks.

class Album
{
    private ?string $title;

    private ?string $artist;

    private array $tracks;

    public function __construct(
        ?string $title = null,
        ?string $artist = null,
        array $tracks = []
    ) {
        $this->title  = $title;
        $this->artist = $artist;
        $this->tracks = $tracks;
    }

    public function getTitle() : ?string
    {
        return $this->title;
    }

    public function getArtist() : ?string
    {
        return $this->artist;
    }

    public function getTracks() : array
    {
        return $this->tracks;
    }
}

An example class representing a track of an album.

class Track
{
    private ?string $title;

    private ?string $duration;

    public function __construct(
        ?string $title = null,
        ?string $duration = null
    ) {
        $this->title    = $title;
        $this->duration = $duration;
    }

    public function getTitle() : ?string
    {
        return $this->title;
    }

    public function getDuration() : ?string
    {
        return $this->duration;
    }
}

Create hydrator and add strategy

Create a hydrator and add CollectionStrategy as a strategy, with a hydrator and a classname for the handled object items.

$hydrator = new Laminas\Hydrator\ReflectionHydrator();
$hydrator->addStrategy(
    'tracks',
    new Laminas\Hydrator\Strategy\CollectionStrategy(
        new Laminas\Hydrator\ReflectionHydrator(),
        Track::class
    )
);

Hydrate data

Create an instance of the example Album class and hydrate data.

$album = new Album();
$hydrator->hydrate(
    [
        'artist' => 'David Bowie',
        'title'  => 'Let\'s Dance',
        'tracks' => [
            [
                'title'    => 'Modern Love',
                'duration' => '4:46',
            ],
            [
                'title'    => 'China Girl',
                'duration' => '5:32',
            ],
            [
                'title'    => 'Let\'s Dance',
                'duration' => '7:38',
            ],
            // …
        ],
    ],
    $album
);

echo $album->getTitle(); // "Let's Dance"
echo $album->getArtist(); // 'David Bowie'
echo $album->getTracks()[1]->getTitle(); // 'China Girl'
echo $album->getTracks()[1]->getDuration(); // '5:32'

Extract data

var_dump($hydrator->extract($album));
/*
array(3) {
  'title' =>
  string(11) "Let's Dance"
  'artist' =>
  string(11) "David Bowie"
  'tracks' =>
  array(3) {
    [0] =>
    array(2) {
      'title' =>
      string(11) "Modern Love"
      'duration' =>
      string(4) "4:46"
    }
    [1] =>
    array(2) {
      'title' =>
      string(10) "China Girl"
      'duration' =>
      string(4) "5:32"
    }
    [2] =>
    array(2) {
      'title' =>
      string(11) "Let's Dance"
      'duration' =>
      string(4) "7:38"
    }
  }
} 
*/