基于 Extbase 的 Typo3 扩展中的消息 "You should never see this warning."
Message "You should never see this warning." in Extbase-based Typo3 extension
我有一个基于 Extbase 的 Typo3 扩展,它有一个分层数据模型。我不得不向这个模型插入一个额外的层,即原始结构是 Project contains multiple items
。现在,我有 Project contains multiple sub-projects
和 Sub-project contains multiple items
。一切都使用 MM 关系表建模并在后端工作。我可以添加、删除、排序子项目和项目。
但是,流体模板不显示任何内容,如果我将子项目传递给 t3lib_utilities_debug::Debug
,我会得到
You should never see this warning. If you do, you probably used PHP
array functions like current() on the
Tx_Extbase_Persistence_ObjectStorage. To retrieve the first result,
you can use the rewind() and current() methods.
在为项目打印 ObjectStorage
时。我假设我添加的 MM 关系以某种方式被破坏了,但我不知道如何破坏。此外,似乎没有调用域模型的 __construct
方法(我添加了调试输出,未打印)。
如果我将调用结果传递给存储库的 findAll
,则枚举有效,但它不适用于我过滤的调用(在我添加附加层之前有效)。过滤方法看起来像 item
public function findBySubProject(SubProject $p) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(false);
$query->matching($query->equals('subproject', $p));
return $query->execute();
}
正如我所说,查询产生了结果,但它们在某种程度上被破坏了。他们的关系。
有什么解决办法吗?
我假设其他人遇到了同样的问题:我不小心使用了一个没有项目的对象作为测试对象。如果您尝试 enumerate/debug/display 空 ObjectStorage
,则会打印警告。
我不知道你在哪个版本的 Extbase 上开发。
但是在 TYPO3 4.6+
上,您应该注意 object
和 reflection
缓存。在开发过程中,您可以通过以下方式禁用此 caching
:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_reflection']['backend'] = 't3lib_cache_backend_NullBackend';
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_object']['backend'] = 't3lib_cache_backend_NullBackend';
由于您的问题与模型的修改有关,您应该尝试在任何更改后截断表 cf_extbase_object
、cf_extbase_object_tags
、cf_extbase_reflection
和 cf_extbase_reflection_tags
.
如果这不能帮助您解决问题,那么您应该让我们更深入地了解您的配置(尤其是 TCA 配置,因为 Extbase 依赖它)。
如何测试 Extbase QueryResult
$items = $this->itemRepository->findAll();
echo count($items);
if ($items) {
echo '<pre>';
foreach ($items as $item) {
print_r($item);
}
echo '</pre>';
}
-- 编辑--
您是否在 TCA 中定义了字段 subproject
?它应该至少可以作为 passtrough
:
类型使用
'subproject' => array(
'config' => array(
'type' => 'passthrough',
),
),
我有一个基于 Extbase 的 Typo3 扩展,它有一个分层数据模型。我不得不向这个模型插入一个额外的层,即原始结构是 Project contains multiple items
。现在,我有 Project contains multiple sub-projects
和 Sub-project contains multiple items
。一切都使用 MM 关系表建模并在后端工作。我可以添加、删除、排序子项目和项目。
但是,流体模板不显示任何内容,如果我将子项目传递给 t3lib_utilities_debug::Debug
,我会得到
You should never see this warning. If you do, you probably used PHP array functions like current() on the Tx_Extbase_Persistence_ObjectStorage. To retrieve the first result, you can use the rewind() and current() methods.
在为项目打印 ObjectStorage
时。我假设我添加的 MM 关系以某种方式被破坏了,但我不知道如何破坏。此外,似乎没有调用域模型的 __construct
方法(我添加了调试输出,未打印)。
如果我将调用结果传递给存储库的 findAll
,则枚举有效,但它不适用于我过滤的调用(在我添加附加层之前有效)。过滤方法看起来像 item
public function findBySubProject(SubProject $p) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(false);
$query->matching($query->equals('subproject', $p));
return $query->execute();
}
正如我所说,查询产生了结果,但它们在某种程度上被破坏了。他们的关系。
有什么解决办法吗?
我假设其他人遇到了同样的问题:我不小心使用了一个没有项目的对象作为测试对象。如果您尝试 enumerate/debug/display 空 ObjectStorage
,则会打印警告。
我不知道你在哪个版本的 Extbase 上开发。
但是在 TYPO3 4.6+
上,您应该注意 object
和 reflection
缓存。在开发过程中,您可以通过以下方式禁用此 caching
:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_reflection']['backend'] = 't3lib_cache_backend_NullBackend';
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_object']['backend'] = 't3lib_cache_backend_NullBackend';
由于您的问题与模型的修改有关,您应该尝试在任何更改后截断表 cf_extbase_object
、cf_extbase_object_tags
、cf_extbase_reflection
和 cf_extbase_reflection_tags
.
如果这不能帮助您解决问题,那么您应该让我们更深入地了解您的配置(尤其是 TCA 配置,因为 Extbase 依赖它)。
如何测试 Extbase QueryResult
$items = $this->itemRepository->findAll();
echo count($items);
if ($items) {
echo '<pre>';
foreach ($items as $item) {
print_r($item);
}
echo '</pre>';
}
-- 编辑--
您是否在 TCA 中定义了字段 subproject
?它应该至少可以作为 passtrough
:
'subproject' => array(
'config' => array(
'type' => 'passthrough',
),
),