我的提前问题:
Extbase 如何决定给定的对象应该是瞬态实体还是修改/持久实体?
是否有任何关于 Extbase 如何将表单数据映射(你会说映射?)到对象中的文档?
我正在使用 Etxbase 为 TYPO3 创建扩展。
我有一个与模型 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 创建一个新对象而不是更新旧对象?
调试实体时的“瞬态”标志仅意味着该实体尚未持久化(
$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 会从聚合根实体中提取当前值(如果您必须指定它才能显示值,则进一步表明存在问题)。
因此解决方案应该是:
@var
注释。{a.myB}
的形式访问实体 B(但请记住,如果聚合根正常工作并且您通过聚合根上的属性路径引用 B 实体的属性,则不需要这样做)。