我正在构建一个带有后端模块的扩展。当我调用 findAll() 方法时,它返回一个“QueryResult”对象。
我尝试使用 findByUid() 检索对象,它确实有效。
我在打字稿中设置了存储pid:
plugin.tx_hwforms.persistence.storagePid = 112
我也可以在打字稿对象浏览器中看到它。
我还将其添加到我的存储库类中:
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
这样存储pid就被忽略了... 它仍然不起作用,findAll 没有返回应有的实体数组
Repository must 从
findAll
方法返回 QueryResult。只有返回单个对象 (findOneByXYZ
) 的方法才会返回其他任何内容。
以下所有操作都会导致 QueryResult 加载其包含的实际结果。在执行其中一项操作之前,不会加载任何结果,并且调试 QueryResult 将不会产生除原始查询之外的任何信息。
$queryResult->toArray();
$queryResult->offsetGet($offset);
和 $queryResult[$offset];
$queryResult->offsetExists($offset);
$queryResult->offsetSet($offset, $value);
和 $queryResult[$offset] = $value;
(但请注意,自己使用 QueryResult 执行此操作是不合逻辑的)。$queryResult->offsetUnset($offset);
和unset($queryResult[$offset]);
(同样,你自己使用这个是不合逻辑的)$queryResult->current()
、->key()
、->next()
、->prev()
、->rewind()
和->valid()
)都可以直接调用,或者在开始迭代 QueryResult 时调用。请注意,
->getFirst()
和->count()
不会导致原始查询触发,并且如果尚未填充,也不会填充结果。相反,他们将执行优化的查询。
Summa summarum:当您获得 QueryResult 时,您必须以某种方式触发它,这通常在您开始呈现结果集时发生。它不是一个预填充数组;它是一个动态填充的迭代器。
这应该可行。FindAll() extbase 检查存储中的存储页面一定有问题,但在 findByXXX() 中它忽略存储。
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\Extbase\\Object\\ObjectManager');
$querySettings = $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$querySettings->setRespectStoragePage(FALSE);
$this->cityRepository->setDefaultQuerySettings($querySettings);
$cities = $this->cityRepository->findAll();
另外使用typoscript模块配置,例如
module.tx_hwforms.persistence.storagePid = 112
确保您的 Typoscript 已加载到根目录中。对于 BE 模块,我更喜欢使用
EXT:hwforms/ext_typoscript_setup.txt
您编写模块和 extbase 配置的位置。
我会检查生成的查询本身。在安装工具中配置以下选项:
$GLOBALS["TYPO3_CONF_VARS"]["sqlDebug"]
注意:不要在生产环境中执行此操作!!
sqlDebug 说明:
将其设置为“0”将避免在屏幕上打印任何信息。
将其设置为“1”只会显示错误。
将其设置为“2”将在屏幕上打印所有查询。
所以在生产环境中你想将其保留为“0”,在开发环境中你应该将其设置为“1”,如果你想知道为什么某些结果为空,请将其配置为“2”。
我猜想某些启用字段配置会导致您的问题。
如果您通过 findByUid 检索对象,您将获得返回,因为启用字段被忽略。在所有其他情况下,都会应用启用字段,这可能会导致您的结果为空。
尝试像下面这样进行调试并检查此存储库中存在的
findAll()
方法。我认为这对您有用点击这里
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(get_class_methods($this->yourRepositoryName)); exit();
添加所有更改后,您需要
uninstall/install
扩展程序。