尝试在控制器操作中将对象分配给视图时,我收到以下消息,因为此对象未被保留:
无法序列化域对象供应商\ Extension \ Domain \ Model \ Object。它既不是具有标识属性集的实体,也不是值对象。
是否有可能在不创建数据库条目的情况下将此对象添加到视图中?
答案 0 :(得分:1)
[InvalidArgumentValueException('Could not serialize Domain Object $className. It is neither an Entity with identity properties set, nor a Value Object.', 1260881688)][1]
中抛出异常UriBuilder
,因此当模型用作创建链接的参数时。
Vendor\Extension\Domain\Model\Object
的实例必须满足以下要求:
Iterator
接口) OR TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject
和其中一个
TYPO3\CMS\Extbase\DomainObject\AbstractValueObject
或 uid
,而不是null
因此,如果直接在控制器中实例化对象,则尚未定义uid
属性。如果提取域对象或使用存储库添加域对象,则会分配此属性。
TypeConverters允许从给定标识符(某些字符串表示,哈希值,...)转换为适当的域对象。以下链接显示了如何为IBAN(国际银行帐户标识符)的概念执行此操作。
TypeConverters必须像ext_localconf.php
一样注册:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter(
\H4ck3r31\BankAccountExample\Domain\Property\TypeConverter\IbanTypeConverter::class
);
然后可以在控制器中使用Iban
对象:
public function someAction(Iban $iban) { ... }
另一个替代方法是将域对象的数组表示分配给视图,并使用它来填充链接参数:
$this->view->assign('myObject', $object->toArray());
在调用控制器操作时,该对象将从提交的数组键重构并用作属性 - 因此数组键和属性必须具有相同的命名,或者定义了持久性列映射。
public function someAction(MyObject $object) { ... }
在我之前提到的银行帐户示例中,它看起来像这样:
术语" Dto"是"数据传输对象"的缩写,因此它不是真正的域实体,没有适当的UID,只是用于在将信息传递给不同组件时将信息封装在域对象中