2016-08-30 1 views
1

Ich versuche, ein paar Entitäten mit der neuen Sylius-Version (1.0) zu erstellen.Sylius - Implementiert Slugable und Timestampable in neue Entität

Ich lese ihre Dokumente, aber ich bin ein bisschen verrückt.

Ich habe eine neue Entität Book.php.

Diese Einheit bekam drei Felder, Autor, Titel und Inhalt.

Wie kann ich Slugable und Timestampable für diese Entität verwenden, um mithilfe von Anmerkungen zwei neue Felder in dieser Entität zu erstellen?

Ich versuche, eine Schnittstelle BookInterface.php zu erstellen, die Slugable und Timestampable-Schnittstellen erweitert, aber offensichtlich, Doctrine nicht die Felder von Schnittstellen zuordnen.

book.php

<?php 

namespace Acme\SyliusBookBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Sylius\Component\Resource\Model\ResourceInterface; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* Book 
* 
* @ORM\Table(name="book") 
* @ORM\Entity(repositoryClass="App\SyliusBookBundle\Repository\BookRepository") 
*/ 
class Book implements ResourceInterface 
{ 
    public function __construct() 
    { 
     $this->createdAt = new \DateTime(); 
    } 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var int 
    * 
    * @ORM\ManyToOne(targetEntity="Sylius\Component\User\Model\User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $author; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="content", type="text") 
    */ 
    private $content; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

GELÖST

Mit Merkmal Gedmo Einheit funktioniert perfekt.

Gedmo\Timestampable\Traits\TimestampableEntity;

Dann ist es Klasse auf Ihrem Unternehmen verwenden:

class Post implements ResourceInterface 
{ 
    use TimestampableEntity; 
+0

Ich weiß nicht Sylius aber warum schreibst du nicht einfach: '/ ** @var \ DateTime @Gedmo \ Timestampable (auf =" update ") ... */private $ aktualisiert;' für Zeitstempel und '/ ** @var string @Gedmo \ Slug (fields = {" name "}) ... */private $ slug;' für slug? – lolmx

+0

Vielen Dank für Ihre Antwort @lolmx, aber ich versuche, über bewährte Verfahren mit Sylius zu lernen :) –

Antwort

0

Schauen Sie sich die Component/Product/Model/Product es die TimestampableTrait verwendet und es nutzt die SlugAwareInterface (durch die ProductInterface). Diese Schnittstellen sind im Component/Resource/Model/ Ordner

gespeichert. So verwenden Sie das Merkmal und erweitert die SlugAwareInterface. Fügen Sie dann die erforderlichen Slug-Funktionen hinzu. getSlug() setSlug()

Interface ProductInterface extends 
    AttributeSubjectInterface, 
    SlugAwareInterface, 
    TimestampableInterface, 
    ToggleableInterface, 
    ProductTranslationInterface, 
    AssociableInterface, 
    CodeAwareInterface, 
    TranslatableInterface, 
    VariableInterface 
{ 
+0

Ja, ich sah es, aber Sylius verwendet Timestampabletrait und diese Felder in XML zuordnen, ist es möglich, die Felder createdAt und updatedAt in Annotationen zuordnen? –

+0

Ich denke, der Kommentar zu Ihrer Frage ist die richtige Antwort für die Verwendung von Anmerkungen. Die xml version Anwendungen Brett

+0

Ja, aber für die Annotation muss ich die Klassenvariable neu definieren und es wird ein Fehler ausgegeben:> Entity \ Post und Gedmo \ Timestampable \ Traits \ Timestampable definiert die gleiche Eigenschaft ($ createdAt) in der Zusammensetzung von Entität \ Buch. Allerdings unterscheidet sich die Definition und wird als inkompatibel betrachtet –

1

Ich glaube, Sie würden mit TimestampableTrait von Sylius nicht in der Lage sein, Anmerkung zu mischen. Eine viel einfachere Lösung besteht darin, ein eigenes Merkmal zu definieren oder das von Gedmo bereitgestellte zu verwenden.

Wie auch immer, warum möchten Sie Anmerkungen mit Code mischen? Wenn Sie Zuordnungen in einer XML/YAML-Datei beibehalten, wird die Logik aufgeteilt und ein Code verständlicher. Das Halten von Datenbankzuordnungen in der Entität verstößt auch gegen ein einziges verantwortliches Prinzip (SOLID Principles).

Hier haben Sie some reading about it.

PS. Ich habe es geschrieben, als du dein Problem gelöst hast. Ich werde es einfach hier lassen, vielleicht wird jemand den Link nützlich finden.

Verwandte Themen