Hallo in die Runde,
ich hab ein kleines Problem mit Vererbung in Flow. Ich hab eine Model-Klasse "A" mit Properties wie "name", "resource", "type" usw. Des Weiteren hab ich eine Model-Klasse "B", die von "File" erbt und noch zusätzlich Properties hat.
namespace MyPackage\MyApplication\Domain\Model;
/**
* @Flow\Scope("prototype")
* @Flow\Entity
*/
class A {
/**
* @var string
* Flow\Validate(type="NotEmpty")
*/
protected $name;
...
}
namespace MyPackage\MyApplication\Domain\Model;
/**
* @Flow\Scope("prototype")
* @Flow\Entity
*/
class B extends \MyPackage\MyApplication\Domain\Model\A {
/**
* @var string
* Flow\Validate(type="NotEmpty")
*/
protected $title;
...
}
Wenn ich nun ein neues B-Objekt erzeuge und persistieren möchte, bekomm ich folgende Fehlermeldung:
Could not add object of Type "\MyPackage\MyApplication\Domain\Model\B"
Entity of type MyPackage\MyApplication\Domain\Model\B is missing an assigned ID for field 'Persistence_Object_Identifier'.
Muss man bei erbenden Klassen im Zusammenhang mit Doctrine irgendetwas berücksichtigen? Muss ich den Persistence_Object_Identifier bei der erbenden Klasse gesondert, z.B. durch eine Annotation oder ähnliches, definieren?
Zusatz:
Wenn ich ein Objekt A erstelle und persistiere, funktioniert das einwandfrei.
Hat jemand eine Idee oder einen Tipp für mich?
VG
Du musst auf jeden Fall die Art der Vererbung per Annotation definieren. Guck Dir z.B. mal
\TYPO3\Party\Domain\Model\AbstractParty
an. Da wird
@ORM\InheritanceType("JOINED")
gesetzt. D.h. jede abgeleitete Class bekommt eine eigene DB Tabelle und die werden dann eben zusammengejoined um die Properties von A und B zu bekommen. Die Alternative ist @ORM\InheritanceType("SINGLE_TABLE") wo quasi alle Properties in einer Tabelle landen und nur entsprechend der tatsächlichen Class genutzt werden.
Ich wusste dass ich da eine Annotation setzen muss, nur wusste ich nicht welche. Danke! 🙂
Ich bin auch schon in der Doctrine Doku fündig geworden (https://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html?highlight=annotations#annref-inheritancetype). Probier ich direkt mal aus und berichte!
Ok, das war eine schwere Geburt, aber jetzt macht es das was es soll. Ich hatte neben den fehlenden Annotations noch weitere Bugs drin, wie z.B. die Super-Klasse nicht abstract gesetzt, den Super-Konstruktor nicht aufgerufen, etc.
Bei den Annotations bin ich noch neben "@ORM\InheritanceType("JOINED")" und "@ORM\InheritanceType("SINGLE_TABLE")" über "@ORM\MappedSuperclass" gestolpert, die genau das macht, was ich brauche. Die Class-Definition der Super-Klasse sieht jetzt also so aus:
/**
* @Flow\Entity
* @ORM\MappedSuperclass
*/
abstract class A {
...
}
Danke nochmal für den Tipp!
Super das es geklappt hat. Ich kriege übrigens leider weder Benachrichtigungen bei PM noch kann ich antworten... Ich muss das mal mit Mittwald klären. Aber dann weißt Du Bescheid.