将YAML实体与ANNOTATION Traits混合的Doctrine2不起作用

时间:2015-12-07 11:57:14

标签: php symfony doctrine-orm

所以我有一些实体使用我的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] app.ERROR:   Doctrine \ Common \ Persistence \ Mapping \ MappingException:Class   'Utils \ DoctrineBundle \ Entity \ SluggableTrait'不存在(未被捕获   例外)   /srv/myapp/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php   运行控制台命令doctrine:schema:update时的第96行   { “异常”:“[对象]   (Doctrine \ Common \ Persistence \ Mapping \ MappingException(代码:0):   类'Utils \ DoctrineBundle \ Entity \ SluggableTrait'不存在   在   /srv/myapp/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:96)“}

                                                                               [Doctrine\Common\Persistence\Mapping\MappingException]                
     

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

     

doctrine:schema:update [--complete] [--dump-sql] [-f | --force] [--em   [EM]]

我试图搜索Trait YAML示例但没有成功......所以我现在卡住了。

好吧,经过一些测试,Doctrine不允许你混合YAML和ANOTTATION而不重新声明属性,这显然是我们想要避免使用Trait(并扩展一个类)

我已经创建了一个公关,以便遵循这一点 https://github.com/doctrine/common/pull/701

此PR允许您使用YAML映射的特征,但不会触发某些事件,因此需要更深入。

1 个答案:

答案 0 :(得分:0)

简短回答:

您无法混合YAML和Annotation映射,Traits也不能与YAML映射一起使用。