Hab da ein kurioses Problem. Ich habe zwei Extensions. In der zweite injected der Controller eine Klasse aus der ersten Injection. Das macht er auch super. Aber nur, solange ich am Repository findByUid() aufrufe. Bei findAll() oder findByProperty() liefert er ein leeres Ergebnis zurück. das ist irgendwie ein Verhalten, das ich nicht erwarte. Möglicherweise fehlt mir eine Einstellung oder ich habe irgendetwas falsch gemacht.
Die erste Extension hat ein typoScript:
config.tx_extbase {
persistence {
classes {
MyVendor\MyExtA\Domain\Model\Item {
mapping {
tableName = tx_myexta_domain_model_item
recordType = \MyVendor\MyExtA\Domain\Model\Item
}
}
}
}
}
Die Controller-Injection:
/**
* itemRepository
*
* @var itemRepository
*/
protected $itemRepository;
/**
* Inject the ItemRepository
*
* @param MyVendor\MyExtA\Domain\Repository\ItemRepository $itemRepository
*/
public function injectItemRepository(ItemRepository $itemRepository)
{
$this->itemRepository= $itemRepository;
}
Der Call:
funktioniert:
$items = $this->itemRepository->findByUid(6);
$this->view->assign('items', $items);
funktioniert nicht:
$items = $this->itemRepository->findAll();
$this->view->assign('items', $items);
$items = $this->itemRepository->findByName('itemX');
$this->view->assign('items', $items);
🤖 KI-Antwort des Forumsboten · automatisch erstellt und von einer zweiten KI gegengeprüft, ohne Gewähr.
Das liegt an der Storage-Page. findByUid() ignoriert die storagePid und sucht auf allen Seiten. findAll() und findBy...() lesen dagegen nur aus den Seiten in persistence.storagePid. Dabei zählt die Konfiguration des Plugins, das gerade läuft, also die deiner zweiten Extension. Dort ist die storagePid vermutlich nicht oder anders gesetzt als der Ordner, in dem die Items liegen. (findByUid() ignoriert außerdem die Sprache. Liegen die Items in einer anderen Sprache als die aktuelle Seite, wäre das die zweite mögliche Ursache.)
Variante 1: storagePid für das Plugin der zweiten Extension setzen (UID des Ordners mit den Items):
plugin.tx_myextb {
persistence {
storagePid = 123
}
}
Variante 2: Das Repository soll die Storage-Page grundsätzlich ignorieren (TYPO3 9):
use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings;
class ItemRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
public function initializeObject()
{
$querySettings = $this->objectManager->get(Typo3QuerySettings::class);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
}
Das gilt dann für alle Plugins, die das Repository nutzen. Wenn nur die zweite Extension betroffen sein soll, ist Variante 1 sauberer.
Nebenbei: recordType brauchst du nur bei Single Table Inheritance (mehrere Model-Klassen in einer Tabelle mit Type-Feld). Für eine normale Tabelle kannst du die Zeile weglassen.
In aktuellen Versionen (TYPO3 12–14) gibt es im Repository kein $this->objectManager mehr. Dort holst du die Settings mit GeneralUtility::makeInstance(Typo3QuerySettings::class) oder per Dependency Injection.