3

Symfony2/Doctrine2でモデリングの問題があります。私は現在、以前のPHPフレームワークからSymfony2にWebサイト全体を渡そうとしています。以前のフレームワークには、好きな概念がありますが、SymfonyとDoctrineでモデル化することはできません。

これが私の問題です。前者のフレームワークでは、クラスAのオブジェクトを他のクラス(B、C、D ...)の他のオブジェクトにリンクすることが可能です。これを行うために、クラスAには、オブジェクトがリンクされているクラスを知るための属性model_id(各クラスの構成ファイルで定義された一意のIDに対応)と、リンクされたオブジェクトの外部IDである属性record_idがあります。 。このようにして、たとえば、クラスCommentを作成し、任意のオブジェクト(ブログ投稿、ユーザーなど)に関するコメントを作成することができます。

これらの一般的なリンクをDoctrineの関係(ManyToOneなど)でモデル化することは不可能に思われるため、前のフレームワークのように、一種のグローバルメソッド、またはたとえばgetItemと呼ばれる各クラスのメソッドを使用することを考えました。 model_idとrecord_idを属性付けしてから、適切なオブジェクトを返します。

しかし、再び私は問題を抱えていました:

  • Entityクラスのデータベースにアクセスする必要がないため、Entityでこのメソッドを直接定義することはできません。

  • グローバルサービスで1回定義するか、リポジトリ内のクラスごとにn回定義すると(今回はデータベースにアクセスできるため可能です)、エンティティコード以外のすべての場所でメソッドを呼び出すことができます。また、前の例では、コメントにアクセスする必要のあるエンティティのすべてのメソッドをエンティティからリポジトリに移動する必要があるため、実装がかなり醜いものになります。そして最後に、エンティティに直接ではなく、リポジトリにほとんどすべてのオブジェクトメソッドを配置します。

オブジェクトを他のオブジェクトに一般的にリンクし、リンクされたオブジェクトを「通常の」教義の関係のように簡単に回復できるこのようなシステムをどのように作成できるかについて、何か考えがありますか?

よろしくお願いします。

4

2 に答える 2

2

あなたの解決策は、オブジェクトAがオブジェクトB、Cなどにリンクされることを事前に知っていることを意味します。しかし、私が実装したかったのは、何が行われるのかを事前に知らない解決策です。リンクになり、クラスAとZで何も変更せずに、オブジェクトAと新しく作成されたクラスZのオブジェクトの間に新しいリンクを作成する可能性があります。このように、前の例をとると、適切にクラスCommentと他のクラスの間に直接的な関係を作らずに、任意のオブジェクトにコメントします。

そして、私はこの問題の解決策を見つけたと思います:

私がやったことは、イベントpostLoadを使用してリスナーを実装することですこれは、エンティティがDoctrineからロードされるたびにトリガーされます。一方、私のエンティティには、たとえば、クラスがまだわからないリンクされたアイテムである属性$itemがあります。postLoadイベントでは、model_idとrecord_idのおかげで、リンクされたアイテムのクラスをデータベースで調べ、オブジェクト自体を返します。次に、Doctrineによってエンティティが返される前に、$item属性を入力します。このように、Doctrineからエンティティを取得するたびに、エンティティとアイテムの間の「偽の」リンクが自動イベントによって構築され、これはすべてのエンティティで機能します。同じ原則で、エンティティを更新するたびにトリガーされるpostUpdateイベントでリンクを更新できます。データベース内の「偽の」リンクを手動で更新します。

詳細については、次のページを読むことをお勧めします。

于 2012-06-18T09:44:24.533 に答える
0

これに似たものを実装する方法はかなり簡単ですが、正確には簡単ではありません。

新しいクラスを作成します。次のような名前を提案します。

CommentTopicRegistry

その中で、他のオブジェクトへのリンクを作成します。

class_a_id
class_b_id
class_c_id

これにより、他の複数のものと関連付けることができます。一度に使用できるリモートIDは1つだけですが、オブジェクト間で使用したり、ormを利用したりすることができます。

object-> comment_threadの初期設定についてそれほど心配したくない場合は、おそらく次のことをお勧めします。

外国人ID外国人
クラス

わかる?

于 2012-06-12T15:01:22.327 に答える