Re: [TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
Moin, On 04/15/2014 12:43 AM, g4-l...@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_ObjectStorageTx_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 ___ TYPO3-german mailing list TYPO3-german@lists.typo3.org http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Re: [TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
Moin nochmal, In meine Model Klasse benötige ich an einer Stelle ein Repository, welches mit makeInstance() instanziiert wird: ah, das faellt mir erst beim zweiten lesen auf: Normalerweise solltest du das nicht machen muessen, repositories in models zu nutzen ist an sich erstmal code smell der auf komische architektur oder fehlerhafte abstraktion hinweist. Gruesse Christian ___ TYPO3-german mailing list TYPO3-german@lists.typo3.org http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Re: [TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
On 04/15/2014 09:25 AM, Christian Kuhn wrote: Moin, On 04/15/2014 12:43 AM, g4-l...@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_ObjectStorageTx_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 ___ TYPO3-german mailing list TYPO3-german@lists.typo3.org http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
Re: [TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
On 04/15/2014 11:43 AM, Christian Kuhn wrote: Moin nochmal, In meine Model Klasse benötige ich an einer Stelle ein Repository, welches mit makeInstance() instanziiert wird: ah, das faellt mir erst beim zweiten lesen auf: Normalerweise solltest du das nicht machen muessen, repositories in models zu nutzen ist an sich erstmal code smell der auf komische architektur oder fehlerhafte abstraktion hinweist. Gruesse Christian Da muss ich Dir natürlich recht geben: Das ist eine alte, recht umfangreiche Extension, und die erste, die wir damals unter 4.5 geschrieben haben. Da steckte Extbase selbst ja noch in den Kinderschuhen... Es handelt sich hier um Relationen, die nicht bidirektional angelegt wurden und dann aber doch von beiden Seiten benötigt wurden. Es ist auf jeden Fall sinnvoll, das alles zu bereinigen, aber ich wollte jetzt erst mal auf die Schnelle versuchen, den Code zum laufen zu kriegen. Grüße, Till ___ TYPO3-german mailing list TYPO3-german@lists.typo3.org http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
[TYPO3-german] 6.2 Extbase - Problem mit makeInstance() und Repository
Hallo, noch ein Problem in meiner Extension, die unter 4.6 funktioniert hat: In meine Model Klasse benötige ich an einer Stelle ein Repository, welches mit makeInstance() instanziiert wird: /** * Returns the messung * * @return Tx_Extbase_Persistence_ObjectStorageTx_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, called in /var/www/typo3_src-6.2.0/typo3/sysext/core/Classes/Utility/GeneralUtility.php on line 4280 and defined in /var/www/typo3_src-6.2.0/typo3/sysext/extbase/Classes/Persistence/Repository.php line 89 (More information) TYPO3\CMS\Core\Error\Exception thrown in file /var/www/typo3_src-6.2.0/typo3/sysext/core/Classes/Error/ErrorHandler.php in line 108. Offfenbar fehlt da noch ein Argument bei makeInstance() - was muss ich da mitgeben? Grüße, Till ___ TYPO3-german mailing list TYPO3-german@lists.typo3.org http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german