[TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository

g4-lisz at tonarchiv.ch g4-lisz at tonarchiv.ch
Tue Apr 15 13:03:55 CEST 2014


On 04/15/2014 09:25 AM, Christian Kuhn wrote:
> 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.
>
Hi Christian,

danke für die ausführliche Erklärung.

Ich hatte das mit dem Ojectmanager schon mit injection und
cerateInstance versucht, hatte da aber nicht viel Glück, ihn zu
erzeugen. Nun habe ich gemerkt, dass das wohl am fehlenden Namespace
liegt (hatte es mit makeInstance('Tx_Extbase_Object_ObjectManager')
versucht).

$objectManager =
t3lib_div::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$repository =
$this->objectManager->get('Tx_Hplusinfo_Domain_Repository_MessungRepository');

Scheint nun zu klappen!

Grüße,
Till


More information about the TYPO3-german mailing list