Doctrine2将YAML实体与ANNOTATION特性混合在一起;不起作用


Doctrine2 mixing YAML entities with ANNOTATION Traits doesn't work

所以我有一些实体使用我的SluggableTrait,它的方法中包含nameslug字段。

trait SluggableTrait
{
    /**
     * @var string
     * @ORM'Column(type="string", length=255, nullable=true)
     */
    private $name;
    /**
     * @var string
     * @ORM'Column(type="string", length=255
     * @Gedmo'Slug(fields={"name"}, updatable=false))
     */
    private $slug;

    /**
     * Set name
     *
     * @param string $name
     *
     * @return SluggableTrait
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
    /**
     * Set slug
     *
     * @param string $slug
     *
     * @return SluggableTrait
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;
        return $this;
    }
    /**
     * Get slug
     *
     * @return string
     */
    public function getSlug()
    {
        return $this->slug;
    }
    /**
     * @return string
     */
    public function __toString()
    {
        return $this->getName() ? $this->getName() : 'n/a';
    }
    public function getClassName()
    {
        $reflect = new 'ReflectionClass($this);
        return $reflect->getShortName();
    }
}

但每当我尝试在YAML映射的实体中使用它时,数据库不会创建它的字段。。。

假设我有Foo

class Foo
{
    use SluggableTrait;
    /**
     * @var integer
     */
    private $id;

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

使用YAML映射

Utils'DoctrineBundle'Entity'Foo:
    type: entity
    id:
        id:
            type: integer
            generator:
                strategy: AUTO

当更新我的模式(甚至创建一个新的空数据库)时,我的foo表将只有id字段,nameslug不存在。

如果我在Trait和Class这两个项中都使用注释,那么一切都会很好。如果混合映射,则不起作用。

当在我的特性中使用YAML映射时,为了尝试一下,每当我尝试更新我的模式时,我都会收到这个错误

〔2015-12-07 13:20:33〕应用程序。错误:条令''通用''持久性''映射''映射异常:类"Utils''DoctrineBundle''Entity''SluggableTrait"不存在(未捕获异常)/srv/myapp/vender/doctrine/common/lib/doctrine/common/Persistence/MmappingException.php第96行,同时运行控制台命令doctrine:schema:update{"exception":"[object](条令''通用''持久性''映射''映射异常(代码:0):类"Utils''DoctrineBundle''Entity''SluggableTrait"不存在在/srv/myapp/vender/doctrine/common/lib/doctrine/common/Persistence/MmappingException.php:96)"}

                                                                               [Doctrine'Common'Persistence'Mapping'MappingException]                

类"Utils''DoctrineBundle''Entity''SluggableTrait"不存在

原则:模式:更新[-complete][-dump-sql][-f|-force][-em[EM]]

我试图搜索一个Trait YAML的例子,但没有成功。。。所以我现在被卡住了。

好吧,经过一些测试,Doctrine不允许在不重新声明属性的情况下混合YAML和ANOTTATION,这显然是我们希望避免使用Trait(和扩展类)的原因

我创建了一个PR来遵循这一点https://github.com/doctrine/common/pull/701

这个PR允许你使用YAML映射的特征,但不会触发一些事件,所以它需要更深入。

简短回答:

您不能混合使用YAML和Annotation映射,而且Traits不适用于YAML映射。