1

特定のクラス型の非スカラー プロパティを持つ Symfony2 エンティティがあります。プロパティは文字列に安全にキャストでき、これがデータベースに永続化される方法です。

このエンティティのインスタンスがデータベースから取得されると、プロパティのゲッターは、予期されるクラスのオブジェクトではなく文字列を返します。

一般的なエンティティの例を次に示します。

<?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 に答える