1

フィールドを持つデータベース構造があります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

4

3 に答える 3

0

これを行うために、エンティティのgetメソッドにコードを追加できるはずです。doctrineのライフサイクルコールバックを確認することもできます:http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-callbacks

于 2013-03-22T23:45:29.500 に答える
0

JMSSerializer を使用して JSON からエンティティを作成できます - https://github.com/schmittjoh/JMSSerializerBundle

そして、私はあなたの質問を理解できませんが、json_array タイプを使用できるかもしれません - http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#doctrine-mapping -種類

DB からデータをロードし、エンティティを作成する必要がありますか? または、JSON から逆シリアル化されたネストされたエンティティを持ついくつかのフィールドを持つエンティティをロードしますか?

于 2013-03-24T21:40:13.760 に答える
0

最終的に私がやったことは、可能なContentタイプごとに異なるテーブルとエンティティを作成し、Doctrine の継承を使用して Doctrine にそれらを処理させることでした。アイデアではありません (より多くのテーブルを意味する非常に多くの型が存在する可能性があり、動的に新しい型を構築することはできないため) が、今のところうまく機能します。

教義の継承

于 2013-04-04T00:24:52.457 に答える