使用extbase分配非持久对象以进行查看

时间:2016-11-16 19:25:43

标签: typo3 fluid extbase

尝试在控制器操作中将对象分配给视图时,我收到以下消息,因为此对象未被保留:

  

无法序列化域对象供应商\ Extension \ Domain \ Model \ Object。它既不是具有标识属性集的实体,也不是值对象。

是否有可能在不创建数据库条目的情况下将此对象添加到视图中?

1 个答案:

答案 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,只是用于在将信息传递给不同组件时将信息封装在域对象中