【问题标题】:Custom hydrator for one-to-many relationship in symfony 3.4symfony 3.4中一对多关系的自定义水合器
【发布时间】:2018-04-16 08:36:06
【问题描述】:

我有 2 个实体:用户、文章和一个多对多关系,用于描述用户与文章的交互。该属性描述了交互的类型(例如,书签...)。

在这种情况下,我需要一个中间实体(UserArticle),它具有从 Article 到 UserArticle 的一对多关系:该属性在 Article 实体中称为 userInteractions。

它是一个 API,当我创建查询构建器时,我会得到当前登录用户喜欢和收藏的文章的这种结果:

//Article Json Object
{ 
       ...
       userInteractions : [
         {
            "type": "like"
         },
         {
            "type": "bookmark"
         }
       ]

}

这对 javascript 前端来说没问题,但不方便:我更愿意公开布尔字段:isLiked:true,书签: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
 }

}

我试图查看对象水合器,但它确实很混乱,不容易理解,我认为在这种情况下使用自定义水合器可能不合适。有什么建议吗? 谢谢

【问题讨论】:

  • 如果您只将此信息与 javascript 前端一起使用,则根本不应该使用自定义 hydrator,但我建议您仅自定义序列化 - 您使用哪种序列化?
  • FosRestBundle 结合 JMS 序列化器通过注解的魔力自动进行序列化。它接受 Doctrine 存储库返回的对象并返回一个 json 视图。你的意思是我应该收回对序列化上下文的控制权?

标签: symfony doctrine-orm one-to-many hydration


【解决方案1】:

如果您想使用 JMS 序列化程序公开属性只是为了使消费客户端更容易读取(尤其是不希望写回该属性,但 OP 没有给出这个方向的提示):

只需使用virtual property

 /**      @Serializer\VirtualProperty()      
@JMS\SerializedName("user_interaction_flags")    */

 public function getInteractionFlags() 
 {
     return array("like" => $this->...);
 }

如果您不需要它们,您甚至可以将“原始”属性排除在序列化之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多