Грешка при отложено зареждане на 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());

Това е обектът "vkbur":

/**
 * @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

Най-доброто решение изглежда е да проверите типа на променливата в метода 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;
}
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