[TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
Christian Kuhn
lolli at schwarzbu.ch
Tue Apr 15 09:25:27 CEST 2014
Moin,
On 04/15/2014 12:43 AM, g4-lisz at tonarchiv.ch wrote:
> Hallo,
>
> In meine Model Klasse benötige ich an einer Stelle ein Repository,
> welches mit makeInstance() instanziiert wird:
>
> /**
> * Returns the messung
> *
> * @return
> Tx_Extbase_Persistence_ObjectStorage<Tx_Hplusinfo_Domain_Model_Messung>
> */
> public function getMessung() {
> $repository =
> t3lib_div::makeInstance('Tx_Hplusinfo_Domain_Repository_MessungRepository');
> return $repository->findByKlinik($this);
> }
>
> Hier kriege ich aber den Fehler:
> #1: PHP Catchable Fatal Error: Argument 1 passed to
> TYPO3\CMS\Extbase\Persistence\Repository::__construct() must implement
> interface TYPO3\CMS\Extbase\Object\ObjectManagerInterface, none given,
Naja, Dein Konstruktur erwartet als erstes Argument eine Instanz die das
Interface ObjectManagerInterface implementiert, das hast du makeInstance
nicht mitgegeben. Dein rufender Code muesste diese Klasse instantiieren
und dann als 2. Parameter makeInstance geben: Weitere Parameter an
makeInstance werden als Konstruktorparameter der zu instantiierenden
Klasse uebergeben.
Wenn du aber ohnehin schon mit extbase Klassen hantierst, solltest du
zur Objekterzeugung nicht mit makeInstance(), sondern mit dem
Objektmanager arbeiten:
- Wenn du von einer Klasse aus instantiierst die nicht selbst mit dem
ObjectManager erzeugt wurde (zB. innerhalb einer nativen scheduler
Klasse), kannst du den ObjektManager mit makeInstance erzeugen, und
machst danach sowas wie $myFoo = $objectManager->get('theClass'). In
deinem Fall wuerde der ObjektManager sehen das du einen
Konstruktorparameter nicht uebergeben hast, ein passendes Object
instantiieren und dem Konstruktor Deiner Klasse uebergeben (das nennt
sich Konstruktor injection).
- Wenn du bereits im extbase scope bist, hast du den Objectmanager
bereits recht oft in $this->objectManager liegen (zB. in controllern),
wenn nicht kannst du entweder den ObjectManager, oder ggf. auch die
Klasse die du haben willst injekten lassen (mit @inject annotation an
einer Klassenproperty, oder mit einer inject* Methode).
Grundsaetzlich ist es ratsam extbase Klassen grundsaetzlich durch den
ObjectManager erzeugen zu lassen, und nicht mit makeInstance.
Gruesse
Christian
More information about the TYPO3-german
mailing list