Ошибка отложенной загрузки TYPO3

Я получаю ошибку

Аргумент 1, переданный в [...] \ FrontendUserRepository :: findMasterByVkbur (), должен быть экземпляром [...] \ MyModel, экземпляром заданного TYPO3 \ CMS \ Extbase \ Persistence \ Generic \ LazyLoadingProxy, вызываемого в [... ] \ MyController.php в строке 123

Почему аргумент по-прежнему является «LazyLoadingProxy», а не «MyModel»?

Это строка 123 в MyController.php:

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

Это объект "вкбур":

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

При "использовании" объекта раньше, например с участием...

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

... Я не получаю эту ошибку в строке 123.


person Sven    schedule 09.12.2016    source источник
comment
Я нашел обходной путь, используя функцию _loadRealInstance в функции получения getVkbur, но Extbase должна делать это автоматически, не так ли?   -  person Sven    schedule 09.12.2016
comment
Extbase не делает это автоматически, в отличие от Fluid. Вы можете получить доступ к свойствам отложенных объектов в вашем шаблоне, и Fluid позаботится о разрешении объектов. Но если вы хотите получить к ним доступ в своем ControllerAction, вам сначала нужно _loadRealInstance.   -  person j4k3    schedule 12.12.2016


Ответы (3)


Как описано здесь и здесь

Это была тема, но от нее отказались.

Решение похоже на то, что вы комментируете:

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);
person René Pflamm    schedule 09.12.2016

Лучшим решением, по-видимому, является проверка типа переменной в методе получения:

/**
 * @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;
}
person Sven    schedule 12.12.2016
comment
Странный. Когда я публиковал небольшую правку в ответе @ rené-pflamm, я думал о том же. Почему, собственно, нет этой части геттеров модели предметной области, почему она просто не встроена в геттеры построителем расширений? - person j4k3; 12.12.2016

Проверка LazyLoadingProxy, как показано выше, в некоторых случаях все еще требуется. Но разве это не должно быть решено так, как описано здесь? https://wiki.typo3.org/Enhanced_Lazy_Loading

person JKB    schedule 07.11.2019