2016-04-07 1 views
0

2つのentityManagerが正しく設定され、正しく動作しています(すべてのマッピングが正しくロードされています)。symfonyのグローバルリクエストパラメータにdefault entityManagerを指定

標準のDoctrine Commandタスクで--emまたは--connection引数が許可されるのと同様の方法で、EntityManager、したがって使用されるDBを効果的に指定したいと思います。

私はコマンドでコンテナの参照を切り替えるのは明白とハックのことを行っている

if ($input->getOption('background')) { 
    $this->container->set('doctrine.orm.entity_manager', $this->container->get('doctrine.orm.background_entity_manager')); 
} 

これは、DBのクエリの最初のx個の作品(長時間実行コマンドである)が、教義再接続を行い、EntityManagerを使用しているように見えるとに接続された他のDBデフォルト:

2016-04-07T11:27:47.792427Z 783 Connect [email protected] on partridge_background using TCP/IP 
2016-04-07T11:27:47.802813Z 783 Query SELECT t0.id AS id_1, t0.name AS name_2, t0.last_completion AS last_completion_3, t0.last_run AS last_run_4, t0.bookie_id AS bookie_id_5 FROM feeds t0 WHERE t0.name = 'CORAL_OPENBET' LIMIT 1 
2016-04-07T11:27:47.823585Z 783 Query SELECT c0_.id AS id_0, c0_.name AS name_1, c0_.canonicalised_name AS canonicalised_name_2, c0_.matchable_name AS matchable_name_3, c0_.display_order AS display_order_4, c0_.filtered AS filtered_5, c0_.name_alias AS name_alias_6, c0_.created_at AS created_at_7, c0_.updated_at AS updated_at_8, m1_.id AS id_9, m1_.domain_id AS domain_id_10, m1_.feed_id AS feed_id_11, m1_.feed_element_id AS feed_element_id_12, m1_.feed_request_url AS feed_request_url_13, m1_.feed_last_updated AS feed_last_updated_14, c0_.category2_id AS category2_id_15, m1_.domain_id AS domain_id_16 FROM category3 c2_, category3 c0_ INNER JOIN metacategory3 m1_ ON c0_.id = m1_.domain_id WHERE c0_.filtered = 0 
2016-04-07T11:27:49.057129Z 784 Connect [email protected] on partridge using TCP/IP 
2016-04-07T11:27:49.060680Z 784 Query SELECT t0.id AS id_1, t0.name AS name_2, t0.canonicalised_name AS canonicalised_name_3, t0.matchable_name AS matchable_name_4, t0.display_order AS display_order_5, t0.filtered AS filtered_6, t0.name_alias AS name_alias_7, t0.created_at AS created_at_8, t0.updated_at AS updated_at_9, t0.category2_id AS category2_id_10 FROM category3 t0 WHERE t0.id = 48 
2016-04-07T11:27:49.065852Z 784 Query SELECT t0.id AS id_1, t0.domain_id AS domain_id_2, t0.feed_id AS feed_id_3, t0.feed_element_id AS feed_element_id_4, t0.feed_request_url AS feed_request_url_5, t0.feed_last_updated AS feed_last_updated_6, t0.domain_id AS domain_id_7 FROM metacategory3 t0 WHERE t0.domain_id = 48 

はそう比較的遅いフレームワークライフサイクルの切り替えこのEntityManagerを行うには、明らかに間違ったアプローチです。私が望むのは、何らかのSymfonyブートストラップイベントリスナーです。リクエストに基づいてデフォルトのEntityManagerを変更することができます(この場合はArgvInputの引数ですが、任意のタイプのリクエストで引数を受け取ることができればいいでしょう)。

私は実行時に動的な設定を操作すると思っていますか?

+0

''これは最初のx個のdbクエリ(長時間実行コマンドです)でも動作しますが、Doctrineが再接続を実行するときには '' - 長期実行コマンドでDoctrineを使用するのが本当に必要なのか再考してください。 PHPはそのようなことを行うようには設計されていませんでしたが、後に、またはそれ以前に、メモリリークが発生します。アプリケーションロジックに関する詳細情報が役立ちます。特にどのようにあなたのうわーを洗い流すのですか? – eRIZ

+0

このコマンドはデフォルトのEMでうまく動作し、ORMのオーバーヘッドが十分に機能しますが、ドキュメントで推奨されているように、間欠的にフラッシュが行われます – elmpp

+0

エンティティマネージャインスタンスを取得するにはどうすればよいですか?関連コードを投稿すると便利です。 – eRIZ

答えて

0

いくつかの考えと少しの研究(https://github.com/symfony/symfony/issues/1437)を与えると、コンテナが「コンパイルされた」性質のため実行時に合理的に戻ることができるサービスを変更できないという結論に至ります。解決策は、独自のconfigsで新しい環境を作成し、myコマンドを呼び出すときに--envスイッチを使用することです。

関連する問題