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

Assign non persisted object to view using extbase

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

Could not serialize Domain Object Vendor\Extension\Domain\Model\Object. It is neither an Entity with identity properties set, nor a Value Object.

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

异常 [InvalidArgumentValueException('Could not serialize Domain Object $className. It is neither an Entity with identity properties set, nor a Value Object.', 1260881688)][1]UriBuilder 中抛出,因此当模型应用作创建 link.

的参数时

Vendor\Extension\Domain\Model\Object 的实例必须满足以下要求:

  • 可以表示为数组(是数组或实现Iterator接口)
  • 扩展 TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject AND 其中之一
    • 延长 TYPO3\CMS\Extbase\DomainObject\AbstractValueObject
    • 有一个有效的 uid,而不是 null

因此,如果您直接在控制器中实例化对象,uid 属性 尚未定义。如果使用存储库获取或添加域对象,则会分配此 属性。

TypeConverters

TypeConverters 允许将给定的标识符(一些字符串表示、散列值...)转换为适当的域对象。以下 link 展示了如何针对 IBAN(国际银行账户标识符)的概念执行此操作。

TypeConverter 必须像这样在 ext_localconf.php 中注册:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter(
    \H4ck3r31\BankAccountExample\Domain\Property\TypeConverter\IbanTypeConverter::class
);

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

public function someAction(Iban $iban) { ... }

使用对象的数组表示

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

$this->view->assign('myObject', $object->toArray());

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

public function someAction(MyObject $object) { ... }

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

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