2017-01-24 5 views
1

Ich entwickle eine Artikeldatenbank mit API-Endpunkten unter Verwendung von Symfony 3.2 und Doctrine 2.5. In dem Antrag Körper, habe ich einen Autor:Kinder in Doctrine Entity als Eigenschaft filtern und mutieren/hydratisieren Eingabe

{ 
    "article": { 
     "title": "Some article", 
     "author": { 
      "email": "[email protected]", 
      "name": "Howard Wedothis" 
     } 
    } 
} 

Ich mag würde eine Update-Einheit mit einem Datetime, Artikel-ID und den Autoren-ID speichern. Um dies zu tun, muss ich folgendes posten:

{ 
    "article": { 
     "title": "Some article", 
     "updates": [{ 
      "author": { 
       "email": "[email protected]", 
       "name": "Howard Wedothis" 
      } 
     }] 
    } 
} 

Dies ist nicht so elegant IMO.

Erste Frage: Was ist der beste Weg, um die einfachen Autorenfelder mutieren/hydratisieren und speichern Sie ein Update gegen den Artikel und Autor? Autoren und Artikel sind ManyToMany, aber ich möchte aus Gründen der Lesbarkeit vor allem vermeiden, ein Array zu veröffentlichen.

Zweite Frage: Ist es möglich, Eigenschaften zu dem Artikel Einheit für created und lastUpdated hinzuzufügen jeweils die erste und die letzte Aktualisierung angezeigt wird aus dem Artikel ohne einen Repository in die Einheit Injektion?

dh

$article->getCreated() // returns first Update 
$article->getLastUpdated() // returns last Update 

Antwort

0

Am Ende habe ich dies durch Hinzufügen der Autor gelöst und das Überschreiben der Autor über Updates und die Lifecycle Events mit einem neuen Update-Einheit auf PrePersist und PreUpdated wie @Matko vorgeschlagen erstellen .

Daten anfordern:

{ 
    "article": { 
     "title": "Some article", 
     "author": { 
      "email": "[email protected]", 
      "name": "Howard Wedothis" 
     } 
    } 
} 

Article.php:

/** 
* @ORM\Entity 
* @ORM\Table(name="articles") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Article 
{ 
    /** 
    * @return Update 
    */ 
    public function getCreated(): Update 
    { 
     return $this->updates->first(); 
    } 

    /** 
    * @return Update 
    */ 
    public function getLastUpdated(): Update 
    { 
     return $this->updates->last(); 
    } 

    /** 
    * @ORM\PrePersist 
    * @ORM\PreUpdate 
    */ 
    public function addUpdate(): void 
    { 
     $update = new Update(); 
     $update->setAuthor($this->getAuthor()); 
     $update->setArticle($this); 
     $this->updates->add($update); 
    } 
} 

Diese Methode der Autor des Unternehmens ist Art entkräften, sondern hält den Artikel Geschichte.

+0

Ich denke, Sie müssen viele-zu-viele Beziehung mit zusätzlichen Spalten in Referenztabelle behandeln: Sie können sich diese Frage ansehen: http://stackoverflow.com/questions/3542243/doctrine2-best-way-to-handle-many-to-many-with-extra-columns-in-reference-table –

0

Antwort auf die zweite Frage - verwenden Lifecycle Rückrufe

<?php 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\HasLifecycleCallbacks 
*/ 
class Author 
{ 
    ... 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $createdAt; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $updatedAt; 

    /** 
    * Get id. 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set createdAt. 
    * 
    * @param \DateTime $createdAt 
    * 
    * @return this 
    */ 
    public function setCreatedAt($createdAt) 
    { 
     $this->createdAt = $createdAt; 

     return $this; 
    } 

    /** 
    * Get createdAt. 
    * 
    * @return \DateTime 
    */ 
    public function getCreatedAt() 
    { 
     return $this->createdAt; 
    } 

    /** 
    * Set modifiedAt. 
    * 
    * @param \DateTime $updatedAt 
    * 
    * @return Article 
    */ 
    public function setUpdatedAt($updatedAt) 
    { 
     $this->updatedAt = $updatedAt; 

     return $this; 
    } 

    /** 
    * Get updatedAt. 
    * 
    * @return \DateTime 
    */ 
    public function getUpdatedAt() 
    { 
     return $this->updatedAt; 
    } 

    ... 

    /** 
    * @ORM\PrePersist 
    * @ORM\PreUpdate 
    */ 
    public function updatedTimestamps() 
    { 
     $this->setUpdatedAt(new \DateTime(date('Y-m-d H:i:s'))); 

     if ($this->getCreatedAt() == null) { 
      $this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s'))); 
     } 
    } 
} 

http://symfony.com/doc/current/doctrine/lifecycle_callbacks.html http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events

In Bezug auf Ihre Anfrage Beispiele einfügen Anfrage und Aktualisierungsanforderung sollte das haben gleiches Format. Sie verkomplizieren Ihr Leben mit diesem Updates Schlüssel.

Verwenden Sie die POST-Methode zum Einfügen von Artikeln und PUT (Sie senden vollständiges Artikelobjekt) oder PATCH (Sie senden nur Felder, die Sie aktualisieren möchten).

https://knpuniversity.com/screencast/rest/put-versus-post

https://knpuniversity.com/screencast/symfony-rest/patch-programmer

+0

Danke - aber durch die Aktualisierung einzelner Felder, werde ich die Autor Informationen verlieren. Wenn eine Person den Artikel erstellt, ein anderer den Artikel, habe ich keine Update-Informationen. Daher möchte ich eine Revision/Update-Historie behalten. –

+0

In Bezug auf die POST/PUT usw. ja - so funktioniert die API - die Beispiele haben das Problem mit dem Schlüssel und nicht mit der Methode hervorgehoben.Also ich bin auf der Suche, um diese detailliertere Meta-Informationen aus dem Autor Schlüssel allein zu erstellen, ohne dass die volle Nutzlast in der Anfrage –

Verwandte Themen