Typo3 Extbase - 在哪些情况下对象是瞬态实体?为什么我的实体对象没有更新而是重新创建了?

问题描述 投票:0回答:1

我的提前问题:

Extbase 如何决定给定的对象应该是瞬态实体还是修改/持久实体?

是否有任何关于 Extbase 如何将表单数据映射(你会说映射?)到对象中的文档?


我正在使用 Etxbase 为 TYPO3 创建扩展。

  • TYPO3 v.11
  • 扩展库
  • 流体

我有一个与模型 B 相关的模型 A。

在数据库内部,B 以“

tx_vendor_ext_a {my_b int(11) unsigned
}”的形式连接到 A。

A 通过动作控制器和 Fluid 显示在前端。 AController 有列表、显示、编辑、删除和创建操作。

当我调用 editAction(A $a) 更改 A 的一些值并保存(更新 Action(A $newA))时,一切正常。但是,当我想要更改 A.myB 的值而不是更新 myB 时,Extbase 会创建一个新对象并使用新 UID 保存新对象。

我有一个不同的示例,其中子对象被更新,而不是重新创建。在更新操作中调试父级显示(将“Kunde”视为 myB):

但是当我调试不起作用的那个时,它显示(将“einstellungen”视为 myB):

注意瞬态实体标志。

我的液体在这两种情况下看起来都是这样的

<f:form action="update" name="a" object="{a}" >
    <f:form.textfield property="myB.name" value="{myB.name}" id="myB-name" />
    <f:form.submit value="Save" />
</f:form>

模型类中的注解:

领域:

@var \ven\ext\Domain\Model\A

吸气剂:

@return \ven\ext\Domain\Model\A

设定者:

@param \ven\ext\Domain\Model\A
@return void

控制器中的注释:

行动:

@param \ven\ext\Domain\Model\A $newA

我必须承认,我真的不知道 Extbase 如何将表单中的属性映射到域对象中。


所以这些是我的问题:

Extbase 如何决定给定的对象应该是瞬态实体还是修改/持久实体?

是否有任何关于 Extbase 如何将表单数据映射(你会说映射?)到对象中的文档?

另外:我可能在哪里犯了错误,导致 Extbase 创建一个新对象而不是更新旧对象?

php typo3 fluid extbase typo3-11.x
1个回答
0
投票

调试实体时的“瞬态”标志仅意味着该实体尚未持久化(

$b->_isNew()
返回
true
)。它不是一种特殊类型的实体(只有一种这样的类型)——它仅与持久性状态有关。换句话说:Extbase 不会决定实体何时是暂时的还是持久的 - 您可以通过持久化或不持久化实体来做出此决定。从您的描述推断,您希望该标志被“修改”,这意味着
$b->_isDirty()
返回
true

您提供的有关您的属性、getter 和 setter 的信息表明存在问题。如果您的实体 B 仅通过实体 B 上的属性与实体 A 关联,那么当从持久性中获取 A 时,B 将不会正确解冻。

根据您的模板代码判断:

<f:form.textfield property="myB.name" value="{myB.name}" id="myB-name" />

看起来,当预期变量为

{myB}
时,您的 B 实体以某种方式单独作为变量
{a.myB}
提供。这可能表明我上面描述的问题是相关的:如果
{a.myB}
没有产生正确的实体,那么实体 A 实际上不知道实体 B 并且映射将会失败。顺便说一句:指定
value="..."
是多余的,因为 Extbase 会从聚合根实体中提取当前值(如果您必须指定它才能显示值,则进一步表明存在问题)。

因此解决方案应该是:

  • 确保您的实体 A 知道实体 B 具有正确的属性和
    @var
    注释。
  • 确保您可以在模板中以
    {a.myB}
    的形式访问实体 B(但请记住,如果聚合根正常工作并且您通过聚合根上的属性路径引用 B 实体的属性,则不需要这样做)。
  • 尽量避免在两个实体上表达关系,除非必须这样做。在您的用例中,正确的选择似乎是 A 知道 B,但反之则不然。如果您必须在两侧都有它,请务必确保将 B 侧配置为 TCA 中的对侧关系字段。仅当您有一个可以与 A 分开处理 B 的实际用例时,在 B 上表达这种关系才有意义(例如,B 有自己的存储库;被视为单独的聚合根)。
© www.soinside.com 2019 - 2024. All rights reserved.