当前位置: 首页 > 知识库问答 >
问题:

DTO和PHP7.4内部的关系:如何水合?

南宫阳冰
2023-03-14

我想知道哪些是好的做法:

假设我有两个实体,一个多个。 两者都是ApiResources,都有一个输出DTO。 所以两个都有变压器。

<?php

/**
 * @ORM\Entity
 * @ApiResource(
 *     output="Dto\Foo"
 * )
 */
class Foo
{
    private int $id;

    /**
    * @ORM\ManyToOne(targetEntity="Bar")
    */
    private Bar $bar;

}

问题是,当我将实体Foo转换为DTO Foo时,我想用Bar DTO来水化它,而不是Bar实体。 但因为我用一个实体来水化它,我就有了一个酒吧实体。 在这个过程的后面,Bar实体被一个Bar DTO替换,ApiPlateform正常工作,但是我的问题是:Bar属性类型会随着时间的推移而被修改(而且它不能进行类型提示)。 在我看来很脏,不是吗?

插图:

Transofer

<?php 

use ApiPlatform\Core\DataTransformer\DataTransformerInterface;

class FooEntityToFooDToTransormer implements DataTransformerInterface
{
    public function transform($object, string $to, array $context = [])
    {
        return new FooDto($object);
        // maybe there is a better way to hydrate FooDto, by getting directly a BarDto here ?
    }
}

DTO:

<?php 

namespace Dto;

class Foo
{
    public int $id;

    // problem is I cant typehint here
    public $bar;

    public function __construct(FooEntity $fooEntity)
    {
        $this->id = $fooEntity->getId();
        $this->bar = $fooEntity->getBar(); // <-- return a Bar entity, transformed later by ApiPlatform into a Bar DTO.
    }
}

有没有一种方法或一个好的做法来适当地水合一个实体的DTO,特别是关于关系?

共有1个答案

祖新觉
2023-03-14

我想这里有两种可能的解决方案,一种是通过多一个参数扩展DTO的构造函数签名并调整转换器,另一种是在DTO的构造函数中进行转换:

<?php 

namespace Dto;

class FooDto
{
    public BarDto $bar;

    // first variant

    public function __construct(FooEntity $fooEntity, BarDto $barDto)
    {
        $this->id = $fooEntity->getId();
        $this->bar = $barDto;
    }

    // second
    public function __construct(FooEntity $fooEntity)
    {
        $this->id = $fooEntity->getId();
        $this->bar = new BarDto($fooEntity->getBar());
    }
}
 类似资料:
  • 我知道这个问题已经被问过很多次了,但我已经试过了我所读到的任何东西。 我想水平和垂直对齐一个div内的img。 容器div在一个modal中显示图片,一旦点击它的预览。那么它将包含任意大小的图片。 我可以水平或垂直对齐,但不能同时对齐。 HTML代码:https://pastebin.com/7dcq1ajg null 模态示例(img未垂直对齐):https://ibb.co/j4nj1q (.

  • 我正在考虑使用DTO投影--我有两个具有一对多关系的实体(EntityOne的一个实例链接到EntityTwo的多个实例),我希望将结果作为一个新的DTO对象返回--我目前正在尝试的是: 其中MyDtoObject如下所示: 但是,这带来的MyDtoObjects比预期的要多得多,而且看起来每个对象都只包含一个entityTwo对象,而不是集合。 如何指示queryDSL创建具有多个entityT

  • 早上好,很高兴见到你。 我最近刚接触Spring Boot,我正在使用REST API,它基本上是一个包含歌曲的播放列表,基本上REST API应该具有以下结构。一个播放列表可以有许多歌曲: 目前,这是我配置实体的方式 实体歌曲 实体播放列表 控制器 我的班级播放列表 我的资源库 但是,当我尝试使用get方法获取播放列表时,我遇到了无限递归问题: 这是由于歌曲实体中的playList字段,当尝试获

  • 我需要测试操作电缆功能内部dockerated rails应用程序,运行JS测试与恶作剧(PhantomJS)。 我试过硒网驱动,铬驱动,无头铬...没有工作。 当然,将彪马设置为水豚服务器。

  • 问题内容: 对于连接到服务器的每个客户端,我都会生成一个新线程,如下所示: 现在,我知道可以使用以下代码关闭 所有 线程: 但是,如何从关闭线程 内 该线程? 问题答案: 启动线程时,它开始执行您提供的功能(如果要扩展,该功能将为)。要结束线程,只需从该函数返回即可。 根据这个,你也可以打电话,这将抛出一个异常,将安静地结束线程。

  • 我知道什么是DTO:一个在进程之间传输数据以减少方法调用数量的对象。我知道什么是hibernate中的延迟加载。 我在《JHipster的全栈开发》一书中读到这样一句话:JHipster在服务器端使用DTO(数据传输对象)和VM(视图模型)。DTO用于将数据从服务层传输到资源层。它们打破了Hibernate事务,避免了资源层触发进一步的延迟加载。 我不明白DTO和延迟加载之间的关系。

  • 我想安装扩展,因为在我的容器中执行composer-install命令时出错: 系统中缺少请求的PHP扩展超文本传输协议*。安装或启用PHP的超文本传输协议扩展。 我的Dockerfile: 我在我的。 我试过: 运行docker-php-ext-安装-j$(nproc)opachepdo_mysqlintl xml肥皂ext-超文本传输协议 我有一个错误: 步骤7/10:运行docker-php

  • 我在类似的问题中搜索过,试过几个答案都没有解决..我有显示城市名称和一些数据的水平回收器视图,问题是我在主回收器视图适配器中的每个位置放置了如下图所示的画布条形图或RV图表,为了水平滚动该图表,我将图表放在水平滚动视图中,以便在从右向左滚动该图表时查看长水平方向上的图表数据,反之亦然,但实际上它并不水平滚动,只有主回收器视图水平滚动到 当触摸它时显示城市,当触摸它滚动(冻结)时RV内的图表没有滚动