[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