所以我有一些实体使用我的SluggableTrait
,它的方法中包含name
和slug
字段。
trait SluggableTrait
{
/**
* @var string
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $name;
/**
* @var string
* @ORMColumn(type="string", length=255
* @GedmoSlug(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映射
UtilsDoctrineBundleEntityFoo:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
当更新我的模式(甚至创建一个新的空数据库)时,我的foo
表将只有id
字段,name
和slug
不存在。
如果我在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)"}[DoctrineCommonPersistenceMappingMappingException]
类"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映射。