EntityRepositoryクラスのEventDispatcher注入のベストプラクティスは何ですか?EventDispatcherをEntityRepositoryに挿入する最も良い方法は何ですか?
10
A
答えて
16
まず、global
を使用するのは、very bad practiceです。私はあなたにこれをしないことを強く勧めます。
第2に、リポジトリにサービスを注入することは良い考えのようではありません。それはしばしばSingle Responsibility Principleのような法律を破ります。
リポジトリのメソッドをラップするマネージャを作成し、必要なイベントをトリガします。詳細については、how to inject repository to a serviceを参照してください。
services.yml
services:
my_manager:
class: Acme\FooBundle\MyManager
arguments:
- @acme_foo.repository
- @event_dispatcher
acme_foo.repository:
class: Acme\FooBundle\Repository\FooRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- "AcmeFooBundle:Foo"
アクメ\ FooBundle \ MyManager
use Acme\FooBundle\Repository\FooRepository;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class MyManager
{
protected $repository;
protected $dispatcher;
public function __construct(FooRepository $repository, EventDispatcherInterface $dispatcher)
{
$this->repository = $repository;
$this->dispatcher = $dispatcher;
}
public function findFooEntities(array $options = array())
{
$event = new PreFindEvent;
$event->setOptions($options);
$this->dispatcher->dispatch('find_foo.pre_find', $event);
$results = $this->repository->findFooEntities($event->getOptions());
$event = new PostFindEvent;
$event->setResults($results);
$this->dispatcher->dispatch('find_foo.post_find', $event);
return $event->getResults();
}
}
次に、あなただけのサービスのように、あなたのコントローラで使用することができます。
$this->get('my_manager')->findFooEntities($options);
あなた本当にがあなたのエンティティにイベントディスパッチャを注入する必要がある場合は、あなたはその後、この
services.yml
services:
acme_foo.repository:
class: Acme\FooBundle\Repository\FooRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- "AcmeFooBundle:Foo"
calls:
- [ "setEventDispatcher", [ @event_dispatcher ] ]
を行うことができますあなたはちょうどsetEventDispatcher
メソッドを追加する必要がありますあなたのリポジトリ。
アクメ\ FooBundle \リポジトリ\ FooRepository
class FooRepository extends EntityRepository
{
protected $dispatcher;
public function setEventDispatcher(EventDispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}
public function findFooEntities(array $options = array())
{
$dispatcher = $this->dispatcher;
// ...
}
}
ただ、コントローラにそれを使用しているときに、リポジトリサービスを呼び出していないことを確認してください。
は
$this->get('acme_foo.repository')->findFooEntities();
が、私はここに同じ問題を抱えてカムませ
$this->getDoctrine()->getManager()->getRepository('AcmeFooBundle:Foo')->findFooEntities();
関連する問題
- 1. リポジトリをASP.NETコントローラに挿入する最も良い方法は何ですか
- 2. python postgresを挿入する最も良い方法は、コマンドを挿入する
- 3. 新しい値を挿入する最も良い方法
- 4. AkkaのActorにSlickでレコードを挿入する最も良い方法は何ですか?
- 5. PHPを使って複数の行をmysqlデータベースに挿入する最も良い方法は何ですか?
- 6. 変数にkwh/yearを入れる最も良い方法は何ですか
- 7. フォームの行をテーブルに入れる最も良い方法は何ですか?
- 8. iSeriesテーブルにColdFusionアプリケーション生成ID値を挿入する最も良い方法は何ですか?
- 9. データベーステーブルに月、日、時間のみを挿入する最も良い方法は何ですか?
- 10. SalesforceのAccountオブジェクトに200万レコードを挿入する最も良い方法は何ですか
- 11. コレクションをロックする最も良い方法は何ですか?
- 12. ユーザーが日付を入力する最も良い方法は何ですか
- 13. oracleでバルク挿入を実行する最良の方法は何ですか?
- 14. 重複した挿入をデータベースに止める最も良い方法は何ですか
- 15. drupalでブログを書く - コンテンツタイプにテキストを挿入する最も良い方法
- 16. レルムにデータを挿入する方が良い方法は何ですか?
- 17. C#:CSSをMSHTMLインスタンスに挿入する最も良い方法は?
- 18. jQuery - 隠しフィールドにリストデータを挿入する最も良い方法は?
- 19. Google Cloud SQLにCSVを挿入する最も良い方法は?
- 20. NuSMVを学ぶ最も良い方法は何ですか?
- 21. Django 1.5を学ぶ最も良い方法は何ですか?
- 22. jQueryを学ぶ最も良い方法は何ですか?
- 23. プロジェクトで最も良いバージョン管理方法は何ですか
- 24. 最も良い方法は何ですか
- 25. 休止状態で大量のレコードを挿入する最も良い方法
- 26. 多くのデータをSolrに挿入する最も良い方法
- 27. ウェブページに特殊文字を挿入する最も良い方法
- 28. 角錐のアレイのオブジェクトにプロパティを挿入する最も良い方法
- 29. Reduxでアクションを入力する最も良い方法は? (フロータイプ)
- 30. DjangoからNeo4jにアクセスする最も良い方法は何ですか?
を行うのですか、とあなたの答えは、理にかなっています。しかし、今やManagerには2つの責任があり、リポジトリをプロキシしてイベントを発生させます。これは非常に "賢明な"質問ですが、SRPを取得するためにリファクタリングをどこで停止しますか? – JorgeeFG
@ JorgeeFG IMOでは、あなたのマネージャで与えられた 'OptionsResolver :: resolve($ options)'と 'ResultHandler :: handle($ results)'(どちらもイベントを呼び出す)をもう一度リファクタリングすることができます。マネージャは、3つのコンポーネントすべてを接続する単純なFacadeとして機能します。しかし、これらの2つのインターフェイスを追加すると、大部分がイベントハンドラで実行できるので、動作を変更することでほとんど改善/変更がないため、過剰な取得を開始するような気がします。 – Touki