Typo3 使用extbase将非持久化对象指定给视图
尝试在控制器操作中将对象分配给视图时,我收到以下消息,因为此对象未持久化: 无法序列化域对象供应商\扩展\域\模型\对象。它既不是设置了标识属性的实体,也不是值对象Typo3 使用extbase将非持久化对象指定给视图,typo3,fluid,extbase,Typo3,Fluid,Extbase,尝试在控制器操作中将对象分配给视图时,我收到以下消息,因为此对象未持久化: 无法序列化域对象供应商\扩展\域\模型\对象。它既不是设置了标识属性的实体,也不是值对象 是否有可能在不创建数据库条目的情况下将此对象添加到视图中?异常[InvalidArgumentValueException('无法序列化域对象$className。它既不是设置了标识属性的实体,也不是值对象',1260881688)][1]被抛出到UriBuilder中,因此,当模型应被用作创建链接的参数时 Vendor\Exten
是否有可能在不创建数据库条目的情况下将此对象添加到视图中?异常
[InvalidArgumentValueException('无法序列化域对象$className。它既不是设置了标识属性的实体,也不是值对象',1260881688)][1]
被抛出到UriBuilder中,因此,当模型应被用作创建链接的参数时
Vendor\Extension\Domain\Model\Object
的实例必须满足以下要求之一:
- 可以表示为数组(是数组或实现<代码>迭代器代码>接口)或
- 扩展
TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject
和
- 扩展
TYPO3\CMS\Extbase\DomainObject\AbstractValueObject
或
- 具有有效的
uid
,而不是null
因此,如果直接在控制器中实例化对象,则尚未定义uid
属性。如果使用存储库获取或添加域对象,则会分配此属性
类型转换器
TypeConverters允许从给定标识符(某些字符串表示、哈希值等)转换为适当的域对象。以下链接展示了如何为IBAN(国际银行账户标识符)的概念实现这一点
类型转换器必须在ext\u 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) { ... }
在我前面提到的银行账户示例中,它如下所示:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter(
\H4ck3r31\BankAccountExample\Domain\Property\TypeConverter\IbanTypeConverter::class
);
术语“Dto”是“数据传输对象”的缩写,因此它不是一个真正的域实体,没有适当的UID,只是在将信息传递到不同组件时用于将信息封装在域对象中。您是否为您的类扩展了TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject?我同意Jozef。。。您的对象是值对象而不是实体吗?是的。它是一个emtity对象。总而言之,可以说没有持久化就没有可视化?更好的方法是:在没有有效UID的情况下链接到实体是不可能的。当对象被持久化并写入数据库表时,将分配UID。我将更新答案以使用类型转换器或直接使用数组。