【问题标题】:TYPO3 Lazy Loading ErrorTYPO3 延迟加载错误
【发布时间】:2016-12-09 10:59:17
【问题描述】:

我得到了错误

参数 1 传递给 [...]\FrontendUserRepository::findMasterByVkbur() 必须是 [...]\MyModel 的实例, TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy 的实例 给定的,在第 123 行的 [...]\MyController.php 中调用

为什么参数仍然是“LazyLoadingProxy”而不是“MyModel”?

这是 MyController.php 中的第 123 行:

$frontendUsers = $this->frontendUserRepository->findMasterByVkbur($this->feuser->getVkbur());

这是“vkbur”对象:

/**
 * @var \MyVendor\MyExt\Domain\Model\MyModel
 * @lazy
 */
protected $vkbur = null;

之前“使用”对象时,例如与...

\TYPO3\CMS\Core\Utility\DebugUtility::debug($this->feuser->getVkbur());

...我在第 123 行没有收到此错误。

【问题讨论】:

  • 我在getter函数“getVkbur”中使用函数“_loadRealInstance”找到了一种解决方法,但Extbase应该自动执行此操作,不是吗?
  • Extbase 不会自动执行此操作,Fluid 会。您可以在模板中访问延迟加载对象的属性,Fluid 将负责解析对象。但如果你想在 ControllerAction 中访问它们,你必须先 _loadRealInstance。

标签: php typo3 extbase


【解决方案1】:

herehere 所述

这是一个话题,但被放弃了。

解决方案似乎是您评论中所说的:

if ($this->feuser->getVkbur() instanceof \TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy) {
 $vkbur = $this->feuser->getVkbur()->_loadRealInstance();
} else {
 $vkbur = $this->feuser->getVkbur();
}
$frontendUsers = $this->frontendUserRepository->findMasterByVkbur(vkbur);

【讨论】:

    【解决方案2】:

    最好的解决办法似乎是在getter方法中检查变量的类型:

    /**
     * @return \MyVendor\MyExt\Domain\Model\MyModel $vkbur
     */
    public function getVkbur() {
        if($this->vkbur instanceof \TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy) {
            $this->vkbur->_loadRealInstance();
        }
        return $this->vkbur;
    }
    

    【讨论】:

    • 很奇怪。就像我对@rené-pflamm 发布的答案进行了小修改一样,我也有同样的想法。为什么域模型的这部分不是 getter,事实上,为什么不是扩展构建器将它内置到 getter 中?
    【解决方案3】:

    在某些情况下,似乎仍然需要检查如上所示的 LazyLoadingProxy。但是不应该像这里解释的那样解决吗? https://wiki.typo3.org/Enhanced_Lazy_Loading

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2020-04-10
      相关资源
      最近更新 更多