使用 extbase 将非持久对象分配给视图

Jon*_*nas 3 typo3 fluid extbase

在尝试将对象分配给控制器操作中的视图时,我收到以下消息,因为该对象未持久化:

无法序列化域对象供应商\扩展\域\模型\对象。它既不是设置了身份属性的实体,也不是值对象。

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

Oli*_*der 5

异常[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接口)
  • 扩展TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject AND 之一
    • 延伸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
);
Run Code Online (Sandbox Code Playgroud)

Iban然后可以在控制器中使用该对象:

public function someAction(Iban $iban) { ... }
Run Code Online (Sandbox Code Playgroud)

使用对象的数组表示

另一种选择是将域对象的数组表示分配给视图并使用它来填充链接参数:

$this->view->assign('myObject', $object->toArray());
Run Code Online (Sandbox Code Playgroud)

调用控制器操作时,对象将从提交的数组键重新构造并用作属性 - 因此数组键和属性必须具有相同的命名,或者定义持久性列映射。

public function someAction(MyObject $object) { ... }
Run Code Online (Sandbox Code Playgroud)

在我之前提到的银行帐户示例中,它看起来像这样:

术语“Dto”是“Data Transfer Object”的缩写,因此它不是真正的域实体,没有适当的 UID,只是用于在将信息传递到不同组件时将信息封装在域对象中。