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

2014-04-15 Diskussionsfäden Christian Kuhn

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

2014-04-15 Diskussionsfäden Christian Kuhn

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

2014-04-15 Diskussionsfäden g4-lisz
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

2014-04-15 Diskussionsfäden g4-lisz
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

2014-04-14 Diskussionsfäden g4-lisz
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