基于 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-projectsSub-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+ 上,您应该注意 objectreflection 缓存。在开发过程中,您可以通过以下方式禁用此 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_objectcf_extbase_object_tagscf_extbase_reflectioncf_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',
        ),
    ),