ich in Lehre Einheit die HaupteinheitWas ist der beste Weg/update Assoziation Nachschlagefelds
/**
* @ORM\Entity()
*/
class Document
{
/**
* @var int
* @ORM\Id()
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var DocumentStatus
* @ORM\ManyToOne(targetEntity="DocumentStatus")
*/
private $status;
/**
* @var string
* @ORM\Column(type="text")
*/
private $text;
}
und die Nachschlag „Enum“ Entität (auf Anfrage deploy Seeding)
/**
* @ORM\Entity(repositoryClass="DocumentStatusRepository");
*/
class DocumentStatus
{
const DRAFT = 'draft';
const PENDING = 'pending';
const APPROVED = 'approved';
const DECLINED = 'declined';
/**
* @var int Surrogate primary key
* @ORM\Id()
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string Natural primary key (name for developers)
* @ORM\Column(type="string", unique=true)
*/
private $key;
/**
* @var string Short name for users
* @ORM\Column(type="string", unique=true)
*/
private $name;
/**
* @var string Full decription for users
* @ORM\Column(type="string", nullable=true, unique=true)
*/
private $description;
}
müssen eingestellt mit einfacher Repository
class DocumentStatusRepository extends EntityRepository
{
public function findOneByKey($key)
{
return parent::findOneBy(['key' => $key]);
}
}
ich mag Domain Logik des Dokumenten-Lebenszyklus verkapseln von Methoden intoducing wie
public function __construct($text)
{
$this->text = $text;
$this->status = $something->getByKey(DocumentStatus::DRAFT);
}
public function approve()
{
try {
$this->doSomeDomainActions();
$this->status = $something->getByKey(DocumentSatus::DRAFT);
} catch (SomeDomainException($e)) {
throw new DocumentApproveException($e);
}
}
...
oder
public function __construct($text)
{
$this->text = $text;
$this->status = $something->getDraftDocumentStatus()
}
public function approve()
{
$this->status = $something->getApprovedDocumentStatus()
}
...
ohne öffentlichen Setter. Außerdem möchte ich das Dokument locker koppeln und testbar machen.
Ich sehe die nächsten Möglichkeiten:
- Permanent inject DocumentStatusRepository (oder eine Dienstleistung, die es kapselt) in jedem Fall durch Konstruktor auf Unternehmen Schaffung und mit öffentlichen Setter in Postload Teilnehmer
- Permanent inject DocumentStatusRepository durch statische Verwendung Document Methode auf Anwendung Bootstrap oder auf loadClassMetadata
- Temporary injizieren DocumentStatusRepository in Konstruktor und Methoden wie Document :: Appreve
- Verwenden Sie die Methode setStatus() mit c omplex Logik basierend auf $ status-> Schlüsselwert
- Encapsulate Dokument Domain-Logik in einigen Documentmanager und Verwendung Document Unternehmen wie einfache Daten storgae oder DTO :(
Gibt es andere Möglichkeiten? Welcher Weg ist einfacher und bequemer auf lange Sicht?
1. Danke für den Rat. Ich verstehe den Nachteil von 'vor dem Einfügen' generierten Bezeichnern wie MySQL AUTOINCREMENT Feldern. – VolCh
2. Ja, in den Geschäftsbegriffen ist es Value Object, aber wenn wir es als Embeddable verwenden, dann haben wir die Felder 'name' und 'description' in jedem Datensatz der Dokumententabelle. Es braucht viel Speicherplatz und macht die Datenbank denormalisiert. Auf der anderen Seite dienen 'name' und 'description' nur für UI-Aufgaben und im Grunde brauchen wir sie nicht in der Datenbank. Aber in der Funktion werden wir andere Felder wie "apllies_from_date" hinzufügen und die Datenbank-Constraint für document.status_id basierend auf dem Dokumenterstellungsdatum und dem Status ab dem Datum festlegen. Wir wollen also 'document_status' trotzdem in der Datenbank haben. – VolCh
3. Dokument haben viele-zu-eins-Verbindung mit DocumentStatus. Bei der ersten Anwendungsbereitstellung haben wir keine Dokumente und haben vier document_status. Später werden wir Millionen Dokumente und die gleichen vier Status haben. Wenn wir ein Dokument entfernen, bleibt der Status in der Datenbank erhalten. Das Dokument ist nicht Eigentümer des DocumentStatus, wenn die letzte Entität (nicht ValueObject) ist. – VolCh