CompositeNamingStrategy¶
Zend\Stdlib\Hydrator\NamingStrategy\CompositeNamingStrategy
allows you to specify which naming strategy should
be used for each key encountered during hydration or extraction.
Basic Usage¶
When invoked, the following composite strategy will extract the property bar
into array key foo
(MapNamingStrategy) and property barBat
into bar_bat
(UnderscoreNamingStrategy):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Foo
{
public $bar;
public $barBat;
}
$mapStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\MapNamingStrategy([
'foo' => 'bar'
]);
$underscoreNamingStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\UnderscoreNamingStrategy();
$namingStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\CompositeNamingStrategy([
'bar' => $mapStrategy,
'barBat' => $underscoreNamingStrategy,
]);
$hydrator = new Zend\Stdlib\Hydrator\ObjectProperty();
$hydrator->setNamingStrategy($namingStrategy);
$foo = new Foo();
$foo->bar = 123;
$foo->barBat = 42;
print_r($foo); // Foo Object ( [bar] => 123 [barBat] => 42 )
print_r($hydrator->extract($foo)); // Array ( [foo] => 123 [bar_bat] => 42 )
|
Unfortunately, this CompositeNamingStrategy can only be used for extraction as it will not know how to handle
the keys necessary for hydration (foo
and bar_bat
, respectively). To rectify this we have to cover the
keys for both hydration and extraction in our composite strategy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Foo
{
public $bar;
public $barBat;
}
$mapStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\MapNamingStrategy([
'foo' => 'bar'
]);
$underscoreNamingStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\UnderscoreNamingStrategy();
$namingStrategy = new Zend\Stdlib\Hydrator\NamingStrategy\CompositeNamingStrategy([
// Define both directions for the foo => bar mapping
'bar' => $mapStrategy,
'foo' => $mapStrategy,
// Define both directions for the barBat => bar_bat mapping
'barBat' => $underscoreNamingStrategy,
'bar_bat' => $underscoreNamingStrategy,
]);
$hydrator = new Zend\Stdlib\Hydrator\ObjectProperty();
$hydrator->setNamingStrategy($namingStrategy);
$foo = new Foo();
$foo->bar = 123;
$foo->barBat = 42;
$array = $hydrator->extract($foo);
print_r($foo); // Foo Object ( [bar] => 123 [barBat] => 42 )
print_r($array); // Array ( [foo] => 123 [bar_bat] => 42 )
$foo2 = new Foo();
$hydrator->hydrate($array, $foo2);
print_r($foo2); // Foo Object ( [bar] => 123 [barBat] => 42 )
|