1

我有一个 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 项目的上下文中,当前最优雅的最佳实践方法是确保从数据库中检索给定实体的属性设置为正确的类型?

4

1 回答 1

1

您应该为此使用自定义映射类型。有关如何实现它们,请参阅http://docs.doctrine-project.org/en/latest/cookbook/advanced-field-value-conversion-using-custom-mapping-types.html 。尤其看看convertToPHPValue()convertToDatabaseValue()方法。

于 2013-10-08T19:58:06.380 回答