Как десериализовать массив в Symfony

Я бы хотел десериализовать массив в класс в Symfony, но я не могу найти способ сделать это без использования, например, json или XML.

Это класс:

class Product
{
protected $id;
protected $name;
...
public function getName(){
return $this->name;
}
...

}

Массив, который я хотел бы десериализовать в класс Product.

$product['id'] = 1;
$product['name'] = "Test";
...

0

Решение

Вы можете сделать это с помощью отражения, как это ..

function unserialzeArray($className, array $data)
{
$reflectionClass = new \ReflectionClass($className);
$object = $reflectionClass->newInstanceWithoutConstructor();

foreach ($data as $property => $value) {
if (!$reflectionClass->hasProperty($property)) {
throw new \Exception(sprintf(
'Class "%s" does not have property "%s"',
$className,
$property
));
}

$reflectionProperty = $reflectionClass->getProperty($property);
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($object, $value);
}

return $object;
}

Который вы бы тогда назвали как ..

$product = unserializeArray(Product::class, array('id' => 1, 'name' => 'Test'));
2

Другие решения

Вам нужно использовать денормализатор напрямую.

Версия:

class Version
{
/**
* Version string.
*
* @var string
*/
protected $version = '0.1.0';

public function setVersion($version)
{
$this->version = $version;

return $this;
}
}

использование:

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Version;

$serializer = new Serializer(array(new ObjectNormalizer()));
$obj2 = $serializer->denormalize(
array('version' => '3.0'),
'Version',
null
);

dump($obj2);die;

результат:

Version {#795 ▼
#version: "3.0"}
3

По вопросам рекламы [email protected]