php – JMS Serializer.创建两种具有“一对多”关系的模型序列化方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – JMS Serializer.创建两种具有“一对多”关系的模型序列化方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4244字,纯文字阅读大概需要7分钟。
内容图文
![php – JMS Serializer.创建两种具有“一对多”关系的模型序列化方式](/upload/InfoBanner/zyjiaocheng/794/20954c180a3643699a1e4149b2ac441d.jpg)
我正在使用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)
)
);
这里我展示了我的代码的简化示例.我用它来存储订单变化的历史.在更新之前和之后,我将此序列化模型保存到数据库中.好.
现在我想序列化Product的模型,其中包含在客户端工作的所有属性.所以我的第一个想法就是使用群组.我需要设置$id和$name属性“Group({‘history’,’edit’})”和所有其他“Group({‘edit’})”.好吧,它适用于产品序列化,但它破坏了第一个解决方案.现在我的“订单历史记录”存储了不必要的信息,如$price和$description.
是否有一些正确的方法来指定Product模型的默认组,如果未隐式指定序列化组(如Orders的历史示例中所示),将使用该默认组?或者使用这两种类型的序列化而不将组移动到Order的模型中的其他方式(因为实际上在这种情况下有多个模型应该被重构).
解决方法:
抱歉.如果我使用“默认”组,我发现所有工作都正确.
<?php
require_once __DIR__ . '/../../../app/Autoload.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\Expose
* @Serializer\Type("integer")
* @Serializer\Groups({"Default", "edit"})
*/
private $id;
/**
* @var string
* @Serializer\Expose
* @Serializer\Type("string")
* @Serializer\Groups({"Default", "edit"})
*/
private $name;
/**
* @Serializer\Expose
* @Serializer\Groups({"edit"})
*/
private $price;
/**
* @Serializer\Expose
* @Serializer\Groups({"edit"})
*/
private $description;
private $hiddenProperty;
function __construct($id, $name, $price, $description)
{
$this->id = $id;
$this->name = $name;
$this->price = $price;
$this->description = $description;
$this->hiddenProperty = 42;
}
}
$product1 = new Product(
1,
'Banana',
10,
'Yellow'
);
$order = new Order([
$product1,
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)
->setGroups(['Default'])
),
$serializer->serialize(
$product1,
'json',
\JMS\Serializer\SerializationContext::create()
->setSerializeNull(true)
->setGroups(['edit'])
),
]);
这是结果:
Array
(
[0] => {"id":86,"products":[{"id":1,"name":"Banana"},{"id":2,"name":"Tomato"}],"total":644} // Here I have short model for history
[1] => {"id":1,"name":"Banana","price":10,"description":"Yellow"} // And here I have expanded model for other purpose.
)
我喜欢JMS-Serializer
内容总结
以上是互联网集市为您收集整理的php – JMS Serializer.创建两种具有“一对多”关系的模型序列化方式全部内容,希望文章能够帮你解决php – JMS Serializer.创建两种具有“一对多”关系的模型序列化方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。