Zum Inhalt springen

Validator - Problem mit LazyLoading von Referenzobjekten

Erstellt am 8. Februar 2012 · 1 Antwort · letzte Antwort am 16. Februar 2012

Tags: Frage

tobla ·

Hallo Zusammen

Ich schreibe einen Validator, welcher überprüft, ob ein ähnliches Objekt bereits existiert. Meine Objekte haben Referenzen auf Kategorien (Category-Objekt). Diese können als parentCategory wiederum eine Refernez auf eine andere Kategorie besitzen. Um nun von einer gegebenen Category die RootCategory herauszufinden, loope ich durch die Hirarchie, bis keine parentCategory mehr definiert ist.

/**
 * Returns the root category
 *
 * @return Tx_MyExt_Domain_Model_EntryCategory $rootCategory
 */
public function getRootCategory() {
	$rootCategory = $this;
	while($rootCategory->getParentCategory()) {
		$rootCategory = $rootCategory->getParentCategory();
	}
	return $rootCategory;
}

Ich führe '$entry->getCategory()->getRootCategory();' auch in einem Controller aus, und dort funktioniert es. Im Validator scheitert gleiches mit der Fehlermeldung:

PHP Catchable Fatal Error: Argument 1 passed to Tx_MyExt_Domain_Repository_EntryRepository::findByProperties() must be an instance of Tx_MyExt_Domain_Model_EntryCategory, instance of Tx_Extbase_Persistence_LazyLoadingProxy given, called in public_html/typo3conf/ext/myext/Classes/Validation/Validator/EntryExistValidator.php on line 55 and defined in public_html/typo3conf/ext/myext/Classes/Domain/Repository/EntryRepository.php line 49

Meines Erachtens sollte Extbase automatisch LazyLoading Objekte instanziieren, wenn sie angefordert werden.

Mein Validator:

/**
 * is a non-existing entry?
 * returns false when name, street and postcode combination exist
 * 
 * @param $entry
 */
public function isValid($entry) {
	$category = $entry->getCategory()->getRootCategory();	
	
	$entryRepository = t3lib_div::makeInstance('Tx_MyExt_Domain_Repository_EntryRepository');
	$entries = $entryRepository->findByProperties($category,$entry->getName(), $entry->getStreet(), '', $entry->getPostCode(), '',$checkParentAndChildCat);
        
	if(count($entries)!=0) {
		$this->addError('Entry already exist', 80002001);
		return false;
	} else {
		return true;
	}
}

* 'myext' wird anstelle unserer Extension verwendet

Hat jemand von euch schon mal mit einem ähnlichen Problem gekämpft und dabei eine Lösung gefunden?

tobla ·
$categoryRepository = t3lib_div::makeInstance('Tx_MyExt_Domain_Repository_EntryCategoryRepository');
$category = $categoryRepository->findByUid($entry->getCategory()->getRootCategory()->getUid());

anstelle

$category = $entry->getCategory()->getRootCategory();

hat das Problem gelöst. Der Grund bleibt rätselhaft.