Я использую JMS Serializer для проекта PHP и наткнулся на одну проблему.
Посмотрите на код
<?php
use JMS\Serializer\Annotation as Serializer;
/**
* @Serializer\ExclusionPolicy("all")
*/
class Order
{
/**
* @var int
* @Serializer\Type("integer")
* @Serializer\Expose
*/
private $id;
/**
* @var Product[]
* @Serializer\Type("array<Product>")
* @Serializer\Expose
*/
private $products;
/**
* @var float
* @Serializer\Type("float")
* @Serializer\Expose
*/
private $total;
private $someInternalProperty;
function __construct($products)
{
$this->id = rand(0, 100);
$this->products = $products;
$this->total = rand(100, 1000);
$this->someInternalProperty = 'Flag';
}
}
/**
* @Serializer\ExclusionPolicy("all")
*/
class Product
{
/**
* @var int
* @Serializer\Type("integer")
* @Serializer\Expose
*/
private $id;
/**
* @var string
* @Serializer\Type("string")
* @Serializer\Expose
*/
private $name;
private $price;
private $description;
function __construct($id, $name, $price, $description)
{
$this->id = $id;
$this->name = $name;
$this->price = $price;
$this->description = $description;
}
}
$order = new Order([
new Product(
1,
'Banana',
10,
'Yellow'
),
new Product(
2,
'Tomato',
12,
'Red'
)
]);
$serializer = \JMS\Serializer\SerializerBuilder::create()
->setPropertyNamingStrategy(new \JMS\Serializer\Naming\SerializedNameAnnotationStrategy(new \JMS\Serializer\Naming\IdenticalPropertyNamingStrategy()))
->build();
print_r(
$serializer->serialize(
$order,
'json',
\JMS\Serializer\SerializationContext::create()
->setSerializeNull(true)
)
);
Здесь я показал упрощенный пример моего кода. Я использую его для хранения истории изменений заказа. До и после обновления я сохраняю эту сериализованную модель в базу данных. Ok.
И теперь я хочу сериализовать модель продукта со всеми свойствами для работы на стороне клиента. Итак, первая идея, которая у меня возникла, — использовать группы. Мне нужно установить для свойств $id и $name "Группа ({'история', 'редактирование'})" и для всех остальных "Группа ({'редактирование'})". Хорошо, это работает для сериализации продукта, но портит первое решение. Теперь моя «история заказов» хранит ненужную информацию, такую как $price и $description.
Есть ли правильный способ указать группу по умолчанию для модели продукта, которая будет использоваться, если группа сериализации не указана неявно (как в примере с историей заказов)? Или какой-либо другой способ сделать эти два типа сериализации доступными без перемещения групп в модель Order (поскольку в действительности в этом случае необходимо реорганизовать более одной модели).