我正在组装一个基于XSD的XML文件,该文件需要存在XML容器元素,即使它是空的.
当我尝试使用JMS序列化程序序列化一个空数组时,如果数组不为空,则配置可行,我根本就没有元素.
我可以通过配置来解决这个问题,还是我必须实现自己的事件处理程序?
提前致谢.
正如标题所说,我正在尝试做出是否在序列化中包含字段的运行时决定.就我而言,这个决定将基于权限.
我正在使用Symfony 2,所以我要做的是添加一个名为@ExcludeIf的附加注释,它接受一个安全表达式.
我可以处理元数据的注释解析和存储,但我无法看到如何将自定义排除策略与库集成.
有什么建议?
注意:排除策略是JMS代码库中的实际构造,我只是无法找出在其他代码库之上集成额外内容的最佳方法
PS:之前我曾经问过这个问题,并指出要使用小组.由于各种原因,这对我的需求来说是一个非常差的解决方案
我希望使用 API 平台对对象层次结构类执行 CRUD 操作。我发现在将继承类与 API 平台一起使用时编写的内容很少,在与 Symfony 的序列化器一起使用时编写的内容也很少,并且我正在寻找更好的方向来专门针对继承类需要以不同方式实现的内容。
假设我有从 Animal 继承的 Dog、Cat 和 Mouse,其中 Animal 是抽象的(见下文)。这些实体是使用 创建的bin/console make:entity
,并且仅进行了修改以扩展父类(及其各自的存储库)并添加 Api-Platform 注释。
组应该如何与继承的类一起使用?每个子类(即狗、猫、老鼠)是否应该有自己的组,还是应该只animal
使用父组?当对animal
所有人使用该组时,某些路由会响应The total number of joined relations has exceeded the specified maximum. ...
,而当混合时,有时会得到Association name expected, 'miceEaten' is not an association.
。这些组是否还允许父实体上的 ApiPropertys 应用于子实体(即 Animal::weight 的默认 openapi_context 示例值为 1000)?
API-Platform 不讨论 CTI 或 STI,我在文档中找到的唯一相关参考是关于MappedSuperclass。除了 CLI 或 STI 之外,还需要使用 MappedSuperclass 吗?请注意,我尝试申请MappedSuperclass
,Animal
但收到了预期的错误。
根据这篇文章以及其他文章,首选的 RESTful 实现似乎是使用单个端点/animals …
想象一下,我有一个简单的对象,结构类似于下面的对象:
Object (SomeClass) {
$someOtherData (array) [
...
]
$data (array) [
"key": "value",
"key": "value",
"key": "value",
"key": "value"
]
}
Run Code Online (Sandbox Code Playgroud)
如果我使用JMS Serializer将此对象序列化为JSON,我会得到一个结构相同的结果,但是$元素位于根元素上,如下所示:
{
"someOtherData": {
...
},
"data": {
"key": "value",
"key": "value",
"key": "value",
"key": "value"
}
}
Run Code Online (Sandbox Code Playgroud)
我需要将$ data变量的内容放在序列化结果的根目录上,即:
{
"someOtherData": {
...
},
"key": "value",
"key": "value",
"key": "value",
"key": "value"
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果是这样,怎么样?
尝试序列化使用特征的模型时,JMSSerializer不会序列化该特征包含的属性.我使用yaml来配置序列化程序,但它似乎无法正常工作.
trait IdentityTrait
{
protected $id;
public function setId($id)
{
$this->id = $id;
return $this;
}
public function getId()
{
return $this->id;
}
}
class OurClass {
use IdentityTrait;
protected $test;
public function getTest() {
$this->test;
}
}
Run Code Online (Sandbox Code Playgroud)
使用JMSSerializerBundle并且以下yaml位于 Resources/config/serializer/Model.Traits.IdentityTrait.yml
MyProject\Component\Core\Model\Traits\IdentityTrait:
exclusion_policy: NONE
properties:
id:
expose: true
Run Code Online (Sandbox Code Playgroud)
而OurClass
配置位于Resources/config/serializer/Model.OurClass.yml
MyProject\Component\Core\Model\OurClass:
exclusion_policy: NONE
properties:
test:
expose: true
Run Code Online (Sandbox Code Playgroud)
一些代码被忽略以专注于该问题
我收到这条消息:
Invalid datetime "2017-11-07T19:46:57.118Z", expected format Y-m-d\\TH:i:sP.
Run Code Online (Sandbox Code Playgroud)
使用JMS Serializer和配置时:
jms_serializer:
handlers:
datetime:
default_format: 'Y-m-d\\TH:i:sP'
Run Code Online (Sandbox Code Playgroud)
我认为我提供的日期格式正确,但显然没有.这是日期错了吗?
如何为@XmlList元素定义cdata和名称空间?
例如,如果我需要修改示例http://jmsyst.com/libs/serializer/master/reference/annotations#xmlnamespace中的 BlogPost 以具有多个作者:
use JMS\Serializer\Annotation as JMS;
/**
* @JMS\XmlNamespace(uri="http://example.com/namespace")
* @JMS\XmlNamespace(uri="http://www.w3.org/2005/Atom", prefix="atom")
* @JMS\XmlRoot("blog-post")
*/
class BlogPost
{
/**
* @JMS\Type("ArrayCollection<JMS\Serializer\Tests\Fixtures\Author>")
* @JMS\XmlList(inline = true, entry="author")
*
* replaced XmlElement(namespace="http://www.w3.org/2005/Atom") with XmlList
*/
private $author;
}
Run Code Online (Sandbox Code Playgroud)
具有类似以下内容的序列化xml:
<?xml version="1.0" encoding="UTF-8"?>
<blog-post xmlns="http://example.com/namespace" xmlns:atom="http://www.w3.org/2005/Atom">
<atom:author>
<full_name>Foo Bar></full_name>
</atom:author>
<atom:author>
<full_name>Baz Qux></full_name>
</atom:author>
</blog>
Run Code Online (Sandbox Code Playgroud)
对于单个@ XmlElement,cdata和名称空间都可以正常工作,但是@XmlList和@XmlCollection没有这样的功能。
有什么线索我应该在列表中的元素的注释处放置什么?
我有JMS序列化程序的问题.当我使用组时,JMS不会序列化我的子类,但是当我不使用组时,一切都没问题.我做错了什么?
$context = SerializationContext::create()->enableMaxDepthChecks();
$context->setGroups(['clientapi']);
$contextWithoutGroup = SerializationContext::create()->enableMaxDepthChecks();
/** @var Serializer $serializer */
$serializer = $this->container->get('jms_serializer');
$dataClientApi = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
$this->getUserFromParam($params), $folder, $categories, $tags
), 'json', $context);
$dataWithout = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
$this->getUserFromParam($params), $folder, $categories, $tags
), 'json', $$contextWithoutGroup);
Run Code Online (Sandbox Code Playgroud)
给:
$dataClientApi = '{"0":{"author":{}}}';
$dataWithout = '{"0":{"author":{id: 2}}}';
Run Code Online (Sandbox Code Playgroud)
那是我的课程.家长:
/**
* Document
*
* @ORM\Table(name="documents")
* @ORM\Entity(repositoryClass="AppBundle\Entity\DocumentRepository")
* @ORM\EntityListeners({"DocumentListener"})
* @JMS\ExclusionPolicy("all")
* @JMS\AccessorOrder("custom", custom = {"id", "folderId", "title"})
*/
class Document implements ResourceInterface
{
use Traits\SortableTrait;
use Traits\TimestampableTrait;
/**
* @var integer
*
* …
Run Code Online (Sandbox Code Playgroud) 我目前正在参与一个在 API 中使用 JMS Serializer 的项目。我们使用了很多虚拟属性——尤其是序列化映射中的表达式 Prop。
App\Entity\MyEntity:
exclusion_policy: none
properties:
id:
expose: true
groups: ['default']
virtual_properties:
child:
exp: object.getChildObject().getIdentifier()
serialized_name: child_identifier
type: string
groups: ['default']
amount:
exp: object.getOtherChild().getAmount()
serialized_name: other_child_amount
type: string
groups: ['default']
Run Code Online (Sandbox Code Playgroud)
这将允许我拥有子属性,而不必为更简洁的 JSON 创建 getter - 对于这些虚拟属性中有一些逻辑的情况非常有用(例如:以下示例中的“金额”)
{
"id": 123,
"child": "Identifier_52",
"amount": 100
}
// instead of
{
"id": 123,
"child": { "identifier" : "Identifier_52" }
"amount": { "weight": 20, "number": 5 }
}
Run Code Online (Sandbox Code Playgroud)
我们最近考虑切换到Symfony Serializer,到目前为止我还没有找到一种简单的方法来重用或重新实现这些配置(表达式)。如果我将属性 …
php serialization symfony jmsserializerbundle jms-serializer
jms-serializer ×10
symfony ×8
php ×6
xml ×2
annotations ×1
doctrine ×1
doctrine-orm ×1
iso8601 ×1
json ×1
rest ×1
symfony-2.8 ×1
xsd ×1