Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typo3 使用extbase将非持久化对象指定给视图_Typo3_Fluid_Extbase - Fatal编程技术网

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。我将更新答案以使用类型转换器或直接使用数组。