0

http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1の記事をフォローしましたが、DI についていくつか質問があります容器。

コントローラー内でイベントを発生させたいとしましょう。コントローラー内でディスパッチャーを取得するにはどうすればよいですか?

テストフレームワークを開始しています

$c->get('app')->handle($request);

ここで、'app' は Symfony\HttpKernel です。依存関係をコンテナーに設定するにはどうすればよいですか? コンテナで定義されたビューエンジンがあるとしましょう

$c->register('view.engine', 'Core\ViewEngine');

そして、コントローラー内でそのオブジェクトを与えるか、そのオブジェクトを解決して、いくつかのビューをレンダリングしたいと考えています。イベントの発火と同じ問題です。コントローラー内の値にアクセスできません。このような状況で DI コンテナーはどのように機能するのでしょうか?

ありがとう!

4

1 に答える 1

-1

さまざまなアプローチがあります。次のステップとして、silex のドキュメントを一読することをお勧めします。silex では、アプリケーション自体が DI コンテナーです。また、Symfony 2 のドキュメントの概要を読むこともできます。

最も単純なアプローチ (および S2 でデフォルトとして使用されるアプローチ) は、DI コンテナー自体をコントローラーに挿入することです。コントローラーは、必要に応じてディスパッチャーなどのサービスを引き出すことができます。

「より良い」アプローチは、コントローラーが必要とする他のものと一緒にディスパッチャーをコントローラーに直接注入することです。コントローラー自体がコンテナーにアクセスする必要がないため、「より良い」です。しかし、コントローラーはその仕事のためだけに多くのサービスを必要とすることが多いため、より困難です。

==============================================

ただし、コントローラーにコンテナーを挿入するにはどうすればよいですか?

そこで、既存のフレームワークを調べることが役に立ち始めます。HTTPKernel はコンポーネントであり、フレームワークではないことに注意してください。使い方はあなた次第です。

Symfony 2 では、app オブジェクトは実際には HTTPKernel ではなく Kernel から派生しています。カーネルには、コンテナのインスタンスだけでなく、HTTPKernel のインスタンスも含まれています。

いくつかの方法があります。唯一の「正しい」ものはありません。

HTTPKernel::handleRaw を調べると、次のことがわかります。

$controller = $this->resolver->getController($request))

コントローラーの作成後にコンテナーを挿入する独自のコントローラー リゾルバー オブジェクトを作成する場合があります。ただ一つの可能​​性。

于 2013-07-11T16:45:11.213 に答える