Zum Inhalt springen

Vererbung und Doctrine

Erstellt am 3. Februar 2014 · 4 Antworten · letzte Antwort am 5. Februar 2014

Tags: Extbase, Datenbank, Frage

idseven ·

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

Unbekannter Benutzer ·

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.

idseven ·

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!

Unbekannter Benutzer ·

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.