在 AbstractValueObject 对象上调用 getter 时,会显示此错误:
属性路径上的属性映射时出现异常 ":不允许创建对象。要启用此功能,您需要 需要设置属性映射配置值 "CONFIGURATION_CREATION_ALLOWED"为 TRUE
如何解决这个问题?
在扩展生成器中,应选择模型作为实体而不是值对象。或者在模型类中更改类定义以扩展 AbstractEntity 而不是 AbstractValueObject
# change this line:
class MyClass extends TYPO3CMSExtbaseDomainObjectAbstractValueObject
# into this line:
class MyClass extends TYPO3CMSExtbaseDomainObjectAbstractEntity
我刚刚找到了解决此问题的方法,而无需丢弃 ValueObject 类型: 在表单 viewhelper 中,必须显式移交 AbstractValueObject 的 UID:
即
<f:for each="{colors}" as="color">
<f:form.radio property="color" value="{color.uid}" />
</f:for>
代替 <f:form.radio property="color" value="{color}" />
,其中 {colors} 是 AbstractValueObject 的数组。
原因可以在这里找到:https://github.com/TYPO3/TYPO3.CMS/blob/master/typo3/sysext/extbase/Classes/Property/TypeConverter/PersistentObjectConverter.php
标题中的注释说:
- 如果输入是字符串,则假定它是 UID。然后,从持久性中获取对象。
- 。
- 如果输入没有标识属性,而是其他属性,我们创建一个新对象并返回它。
根据定义,值对象没有标识。因此,在不创建新映射器的情况下添加它的唯一方法是将 UID 作为字符串参数传递给属性映射器。