2016-08-30 1 views
1

Я пытаюсь создать несколько сущностей с новой версией Sylius (1.0).Sylius - реализует Slugable и Timestampable в новом объекте

Я читаю их документы, но я немного злюсь.

Получил новый объект Book.php.

Эта сущность есть три поля, автор, названия и содержания.

Как я могу использовать Slugable и Timestampable для этого объекта для создания двух новых полей этого объекта с помощью аннотаций?

Я пытаюсь создать интерфейс BookInterface.php, который расширяет возможности Slugable и Timestampable интерфейсов, но, очевидно, Doctrine не отображает поля интерфейсов.

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; 

решаемые

Использование Gedmo сущности признака работает отлично.

Gedmo\Timestampable\Traits\TimestampableEntity;

Затем использовать его на своем классе сущностей:

class Post implements ResourceInterface 
{ 
    use TimestampableEntity; 
+0

Я не знаю, Силиус, но почему бы вам просто не написать: '/ ** @var \ DateTime @Gedmo \ Timestampable (on =" update ") ... */private $ updated;' для timestamp , и '/ ** @var string @Gedmo \ Slug (fields = {" name "}) ... */private $ slug;' для slug? – lolmx

+0

Спасибо за ваш ответ @lolmx, но я пытаюсь узнать о хороших практиках с Sylius :) –

ответ

0

Отъезд Component/Product/Model/Product он использует TimestampableTrait и он использует SlugAwareInterface (через ProductInterface). Эти интерфейсы хранятся в папке Component/Resource/Model/

Таким образом, используйте этот признак и расширьте SlugAwareInterface. Затем добавьте необходимые функции slug. getSlug() setSlug()

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

Да, я видел это, но Sylius использует timestampabletrait и отображает эти поля в XML, его можно сопоставить поля createdAt и updatedAt в аннотациях? –

+0

Я думаю, что комментарий по вашему вопросу - правильный ответ на использование аннотаций. XML-версия использует <имя = столбец = тип поля "createdAt" "created_at" = "Дата и время"> <имя поля = столбец "updatedAt" = "updated_at" type = "datetime" nullable = "true"> Brett

+0

Да, но для аннотации мне нужно переопределить переменную класса, и она выдает ошибку:> Entity \ Post и Gedmo \ Timestampable \ Traits \ Timestampable определяют одно и то же свойство ($ createdAt) в составе Entity \ Book. Однако определение отличается и считается несовместимым –

1

Я думаю, вы не сможете смешивать аннотаций с TimestampableTrait от Sylius. Более простым решением является определение вашей собственной черты или использование той, которая предоставляется Gedmo.

В любом случае, почему вы хотите смешивать аннотации с кодом? Сохранение сопоставлений в файле xml/yaml разделяет логику и делает код более понятным. Сохранение сопоставлений баз данных внутри объекта также нарушает Единый ответственный принцип (SOLID Principles).

У вас есть some reading about it.

PS. Я писал это, когда вы решили свою проблему. Я просто оставлю это здесь, может быть, кто-то найдет ссылку полезной.