あなたの質問にはサブ質問がたくさんあるので、まず最初にいくつかのことを明確にしようとします。
最初に使用した命名規則は少しばかりですが、これは将来、あなたのコードで動作するかもしれない他の人達に役立ちません。(おそらくあなたは成長し、より多くの開発者を雇う必要があります。だから、いくつかの命名法から始めましょう。
class PersistenceClass
{
public function parse(array $posts)
{
foreach ($posts as $post) {
// 1. Parse $post
// 2. Parse content with SyntaxClass
// 3. Persist $post in the database
}
}
}
同じことがSyntaxClass
にも適用されます:それは$content
を受信して、いくつかの方法でそれを解析し、その後の参照を設定し、持続
何がPersistenceClass
を呼び出していることは、このようなものかもしれません。
これは、境界線を設定するためのものです。
質問にお答えください。
私は非常にそれを好まないが、私は、SyntaxClassに教義EMを注入し、 DBの私の参照を見つけることができます。
これはまさにあなたがしなければならないことです! OOP開発はこのように機能します。
ただし、命名規則に問題があります。エンティティマネージャを挿入する方法は、クラスの構造によって異なります。
良いデザインはservicesを使用してください。
ので、現在、現実にはPersistenceClass
とSyntaxClass
がPersistenceService
とSyntaxService
を(私は私のコードで私はいつもマネージャーやハンドラを区別するのでPersistenceManager
とSyntaxManager
を、それらを呼び出すprefere場合にも呼ばれるべきものです - しかし、これは私の慣習です、私はここでそれについてもっと詳しく書きません)。
今、別の間違ったことをイメージしています(あなたの質問を読んで、私はイメージしています!):PersistenceService
(現在はPersistenceClass
という名前)からSyntaxService
(現在はSyntaxClass
という名前)というインスタンスを作成しています。これは間違っています。あなたは、各ポストのためSyntaxService
の新鮮なインスタンスが必要な場合
は、その後、あなたはSyntaxService
の新鮮なインスタンスを取得しますので、SyntaxFactory::create()
を呼び出し、ファクトリクラス(たとえばSyntaxFactory
)を使用する必要があります。新しく作成されたSyntaxClass
にエンティティマネージャを注入するファクトリ自体です。
それぞれ新しいインスタンスを必要としない場合は、代わりにSyntaxClass
をサービスとして宣言し、それを注射によってPersistenceService
に渡します。この最後のシンプルな例下:
# app/config/service.yml
services:
app.service.persistence:
class: ...\PersistenceService
# Pass the SyntaxInstance directly or a factory if you need one
aguments: ["@doctrine.orm.default_entity_manager", "@app.service.syntax"]
app.service.syntax:
class: ...\SyntaxService
aguments: ["@doctrine.orm.default_entity_manager"]
しかし、より大きな問題は、私がどのようにアクセスすることができているだけ持続しますが、 はPersistenceClassからエンティティをフラッシュされませんか?
ここで2番目の質問:{persisted + flushed}と{persisted + not flushed}エンティティを検索する方法は?
問題は、フラッシュされる前に永続化されているがフラッシュされていないエンティティにフラッシュIDがないため、IDを検索パラメータとして使用できないことです。
解決策は別のサービスを作成することです:SearchReferencesService
。その中でエンティティマネージャーも注入します(前述のように)。
このクラスには、検索を行うsearch()
というメソッドがあります。 getScheduledEntityInsertions()
、getScheduledEntityUpdates()
、getScheduledEntityDeletions()
、getScheduledCollectionDeletions()
とgetScheduledCollectionUpdates()
:エンティティを検索するに
が持続しますがフラッシュされない、UnitOfWork
はあなたにいくつかの興味深い方法を提供します。
あなたが話している配列はすでに存在しています。オブジェクトをオブジェクトごとに比較して、IDのもの以外のフィールド(検索されたフィールドはまだ存在しないため)に基づいて比較する必要があります。
残念ながら、検索の性質について詳しく説明していないので、この検索の仕方については正確には言えませんが、検索単位を使用して検索する必要があります最初の検索でnull
の結果が返された場合は、データベースに接続して作業してください。また、この検索を(データベース内で、そして作業ユニットまたは副作業の前に)行う順序もあなた次第です。
希望すると、これが役立ちます。
[EntityManager#getUnitOfWork()]([documentation](http://docs.doctrine-project.org/projects/doctrine-orm/en)からUnitOfWorkの 'EntityManager#getUnitOfWork()'を見れば、 /latest/reference/working-with-objects.html#direct-access-to-a-unit-of-work)) – lolmx