我有一个Symfony2实体,它具有给定类类型的非标量属性。该属性可以安全地转换为字符串,这就是它在数据库中的持久性。
当从数据库中检索此实体的实例时,该属性的getter返回一个字符串而不是一个期望类的对象。
以下是一个通用示例实体:
<?php
namespace Acme\ExampleBundle\Entity;
class ExampleEntity
{
/**
* @var \example\ComplexObject
* @\Doctrine\ORM\Mapping\Column(type="string")
*/
protected $property;
/**
* @param \example\ComplexObject $property
* @return \ExampleEntity
*/
public function setProperty(\example\ComplexObject $property) {
$this->property = $property;
return $this;
}
/**
* @return \example\ComplexObject
*/
public function getProperty() {
return $this->property;
}
}
要明确的是,从数据库中检索后,在此实体的实例上调用getProperty()
会返回一个字符串,而不是\example\ComplexObject
的实例。
我很欣赏Symfony和/或Doctrine不知道如何将直接从数据库中检索到的字符串值转换为所需的对象。
如果代码期望对象是给定类型而不是字符串,我可以执行字符串到对象的转换,但是如果从这个类型的实体中检索到这种类型的实体时会自动发生这种情况会更加优雅。数据库中。
我有这个实体的自定义实体存储库,并试图覆盖find()
方法,但似乎没有调用。
我可以修改getProperty()
方法,从字符串转换为正确的对象类型,但这似乎不够优雅,并且将实体和相关字符串与对象翻译器紧密联系起来。
在Symfony2项目的上下文中,当从数据库中检索时,确保给定实体的属性设置为正确类型的当前最优雅的最佳实践方法是什么?
答案 0 :(得分:1)
您应该为此使用自定义映射类型。有关如何实施它们,请参阅http://docs.doctrine-project.org/en/latest/cookbook/advanced-field-value-conversion-using-custom-mapping-types.html。特别要看一下convertToPHPValue()
和convertToDatabaseValue()
方法。