フィールドを持つデータベース構造がありますcontent
。データベースでは、これはBLOB
(so a string
)です。content
JSONでエンコードされた文字列が含まれています。
これをロードするときに、特定のオブジェクトにロードしたいと思います( JSONの可能な形式ごとContent
に異なるサブクラスを使用)。Content
エンティティが構築される直前に値をキャッチできるようにフックできるイベントや何かがありますか(したがって、汎用である必要はなくsetContent()
、クラスにタイプヒントを与えることができます。Content
インターセプトする前にエンティティにロードされます)。
何か案は?
もう少し詳細。基本的に私が想像しているのは、JSON文字列を受け取って適切なオブジェクトに変換するファクトリクラスのようなものです。
{
body: "ABC",
value: 5
}
次のようなクラスのオブジェクトに移動します。
class MyContent extends Content
{
protected $body;
protected $value;
}
オブジェクトへのJSON文字列であるため、通常のオブジェクトマッピングを使用できません。
さらなる解明
基本的に、私はという名前のエンティティを持っていますBox
。のインスタンスであると想定される値がありBox
ます。content
Content
通常の状況では、が通常のデータベースエンティティである場合、とContent
の間の1対1の関係をフックするだけで、特別なことをすることなく適切に読み込まれます。Box
Content
Content
Box
ただし、この場合、Content
多くの形式を持つことができます。これを処理するために、JSONオブジェクトとしてのテーブルのBLOB
フィールドに保存されます。Box
これは、DoctrineがロードしようとBox
すると、文字列をロードしようとすることを意味します。
単純に任意のパラメーターを受け入れ、それが文字列であるかオブジェクトBox::setContent()
であるかに基づいてそれに応じて処理することができます。Content
ただし、使用する場合は常にオブジェクトであるContent
ため、関数(つまりBox::setContent(Content $content)
)の型ヒントが必要です。問題は、これによりDoctrineがそのフィールドに文字列を与えることができなくなることです。
そのため、Doctrineが持つ値をインターセプトcontent
し、エンティティにロードする前に適切なオブジェクトに置き換えますBox
。
Doctrineのイベントのどれも私が望むことを正確に実行するとは思わないので、それは実際には不可能かもしれません。= S