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