Php Sylius-在新实体中实现slagable和timestable

Php Sylius-在新实体中实现slagable和timestable,php,sylius,Php,Sylius,我试图用新的Sylius版本(1.0)创建一些实体 我在看他们的文件,但我有点生气了 获得了一个新实体Book.php 该实体有三个字段,作者,标题和内容 如何使用该实体上的slagable和timestable来使用注释在该实体上创建两个新字段 我尝试创建一个接口BookInterface.php,它扩展了slagable和timestable接口,但显然,条令没有映射接口的字段 Book.php <?php namespace Acme\SyliusBookBundle\Entity

我试图用新的Sylius版本(1.0)创建一些实体

我在看他们的文件,但我有点生气了

获得了一个新实体
Book.php

该实体有三个字段,作者标题内容

如何使用该实体上的slagable和timestable来使用注释在该实体上创建两个新字段

我尝试创建一个接口
BookInterface.php
,它扩展了slagable和timestable接口,但显然,条令没有映射接口的字段

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;

查看
组件/产品/模型/产品
它使用
时间标签特征
,并使用
SlugAwareInterface
(通过
产品界面
)。这些接口存储在
组件/Resource/Model/
文件夹中

因此,使用trait并扩展
SlugAwareInterface
。然后添加必要的slug函数<代码>getSlug()setSlug()


我认为您不能将注释与Sylius的
TimestableTracit
混合使用。一个更简单的解决方案是定义自己的特性或使用Gedmo提供的特性

无论如何,为什么要将注释与代码混合使用?将映射保存在xml/yaml文件中会分裂逻辑,使代码更易于理解。将数据库映射保留在实体内也违反了一个单一的责任原则(可靠原则)

给你


顺便说一句,当你解决了你的问题时,我正在写它。我将把它留在这里,也许有人会发现这个链接很有用

我不知道Sylius,但你为什么不写:
/**@var\DateTime@Gedmo\timestable(on=“update”)…*/更新了私人文件$
/**@var string@Gedmo\Slug(字段={“name”})私人$slug
对于slug?感谢您的回复@lolmx,但我尝试了解Sylius的良好实践:)是的,我看到了,但Sylius使用TimestableTrait并将这些字段映射到XML中,它可以映射注释中的createdAt和updatedAt字段?我认为关于您的问题的评论是使用注释的正确答案。xml版本使用Yes,但对于注释,我需要重新定义类变量,它会抛出一个错误:>Entity\Post和Gedmo\Timestable\Traits\Timestable在Entity\Book的组合中定义相同的属性($createdAt)。但是,定义不同,被认为是不兼容的。我找到了解决方案,就在这个问题上加了它。谢谢大家!
class Post implements ResourceInterface
{
    use TimestampableEntity;
Interface ProductInterface extends
    AttributeSubjectInterface,
    SlugAwareInterface,
    TimestampableInterface,
    ToggleableInterface,
    ProductTranslationInterface,
    AssociableInterface,
    CodeAwareInterface,
    TranslatableInterface,
    VariableInterface
{