symfony 3.4 中一对多关系的自定义水化器
Custom hydrator for one-to-many relationship in symfony 3.4
我有 2 个实体:用户、文章和与属性的多对多关系,用于描述用户与文章的交互。该属性描述了交互的类型(例如,书签...)。
在这种情况下,我需要一个中间实体 (UserArticle),它具有从 Article 到 UserArticle 的一对多关系:属性 在 Article 实体中称为 userInteractions。
这是一个 API,当我创建查询生成器时,我得到了一篇文章的这种结果,该文章已被当前登录用户点赞并添加为书签:
//Article Json Object
{
...
userInteractions : [
{
"type": "like"
},
{
"type": "bookmark"
}
]
}
没关系,但对 javascript 前端来说不方便:我更愿意公开布尔字段:isLiked: true, bookmarked: true, otheraction: false ...,因为它更容易解析。
我想我必须写一个定制的保湿器。我为另一种关系(没有属性的多对多)做了它,它就像一个魅力,但在这种情况下,它只在有 0 个或一个交互时才有效。如果有 2 个或更多操作,我会在调用父 Doctrine Object hydrator 时收到 500 错误和通知。这是我的保湿器 :
class ArticleHydrator extends ObjectHydrator {
protected function hydrateRowData(array $data, array &$result)
{
$hydratedResult = [];
parent::hydrateRowData($data, $hydratedResult);
//this call generates a notice Undefined offset: 0 at line 525 of doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
$article->setUserInteractionsFlags();
// works with less than 2 interactions in the left join and correctly hydrates the not-persisted booleans added to Article entity
}
}
我试图查看 Object 水化器,但它确实一团糟而且不容易理解,我想也许在这种情况下使用自定义水化器是不合适的。有什么建议吗?
谢谢
如果你想用 JMS 序列化器公开属性只是为了让消费客户端更容易阅读(尤其是不希望写回这个属性,但 OP 没有给出这个方向的提示):
只需使用 virtual property:
/** @Serializer\VirtualProperty()
@JMS\SerializedName("user_interaction_flags") */
public function getInteractionFlags()
{
return array("like" => $this->...);
}
如果不需要 "original" 属性,您甚至可以将其排除在序列化之外。
我有 2 个实体:用户、文章和与属性的多对多关系,用于描述用户与文章的交互。该属性描述了交互的类型(例如,书签...)。
在这种情况下,我需要一个中间实体 (UserArticle),它具有从 Article 到 UserArticle 的一对多关系:属性 在 Article 实体中称为 userInteractions。
这是一个 API,当我创建查询生成器时,我得到了一篇文章的这种结果,该文章已被当前登录用户点赞并添加为书签:
//Article Json Object
{
...
userInteractions : [
{
"type": "like"
},
{
"type": "bookmark"
}
]
}
没关系,但对 javascript 前端来说不方便:我更愿意公开布尔字段:isLiked: true, bookmarked: true, otheraction: false ...,因为它更容易解析。
我想我必须写一个定制的保湿器。我为另一种关系(没有属性的多对多)做了它,它就像一个魅力,但在这种情况下,它只在有 0 个或一个交互时才有效。如果有 2 个或更多操作,我会在调用父 Doctrine Object hydrator 时收到 500 错误和通知。这是我的保湿器 :
class ArticleHydrator extends ObjectHydrator {
protected function hydrateRowData(array $data, array &$result)
{
$hydratedResult = [];
parent::hydrateRowData($data, $hydratedResult);
//this call generates a notice Undefined offset: 0 at line 525 of doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
$article->setUserInteractionsFlags();
// works with less than 2 interactions in the left join and correctly hydrates the not-persisted booleans added to Article entity
}
}
我试图查看 Object 水化器,但它确实一团糟而且不容易理解,我想也许在这种情况下使用自定义水化器是不合适的。有什么建议吗? 谢谢
如果你想用 JMS 序列化器公开属性只是为了让消费客户端更容易阅读(尤其是不希望写回这个属性,但 OP 没有给出这个方向的提示):
只需使用 virtual property:
/** @Serializer\VirtualProperty()
@JMS\SerializedName("user_interaction_flags") */
public function getInteractionFlags()
{
return array("like" => $this->...);
}
如果不需要 "original" 属性,您甚至可以将其排除在序列化之外。