5

昨日記事を読みました: https://igor.io/2012/11/09/scaling-silex.html

そしてもう一つhttp://davedevelopment.co.uk/2012/10/03/Silex-Controllers-As-Services.html

そこで、概念的な疑問が頭に浮かびました。

現在、私は別々のクラスに多くのコントローラーを持っています。上書きcontroller_resolverしてコントローラー クラスのインスタンスを作成し、コントローラー$appのコンストラクターに挿入します。

私はこのようにルートを定義します$app->get('/hello', 'HelloController::indexAction')<- 私のコントローラーリゾルバーは作成しますnew HelloController($app);- これまでのところとても良い. $appしかし、正直なところ、 ServiceLocator の使用方法のように見える全体を注入するため、DependencyInjection ではなく ServiceLocator パターンになりました。

今、私は疑問に思っています:そのままにしておくべきですか(うまく動作するため)、または「コントローラーをサービスとして」試して、コントローラーが実際に依存しているサービスのみを注入する必要がありますか? 私のSeviceLocatorアプローチがいつか私を襲うのでしょうか? (人々はDIがテストに適していると言います)。

ControllerSymfony Framework Bundle: class extends abstract classも調べましたContainerAwareが、これには全体が$container注入されています! フルスタックフレームワークでの ServiceLocator アプローチ?

推奨事項はありますか?長所短所?

4

2 に答える 2

4

symfony2 フルスタック フレームワーク

フレームワークは、Service Locator パターンではなく、Dependency Injection パターンを使用します。

すべてのコントローラーは、既定ではサービスではありません。このContainerAwareクラスには、サービス コンテナーにアクセスするためのメソッドが含まれているため、コントローラー内でサービスを呼び出すことができます。

コントローラーをサービスとして使用する場合は、Controller拡張を削除する必要があります。コントローラー内で使用するすべての依存関係は、サービス コンテナーによって注入される必要があります。

詳細については、Symfony2 の主要な貢献者の 1 人である Richard Miller によるブログ投稿を参照してください。

Silex マイクロフレームワーク

Silex マイクロフレームワークは、フレームワークの骨組みを提供します。アーキテクチャがどのように見えるか、どのパターンを使用するかはあなた次第です。

Silex のドキュメントでは、サービスではないコントローラーを使用しています。コントローラー内に完全なサービス コンテナーを挿入します。

$app->post('/post/{id}-{slug}', function($id, $slug) use ($app) {
    // ...
});

コントローラーをサービスとして使用する場合は、使用するサービスのみをコントローラー内に挿入する必要があります。

編集:Controller::action構文は、サービスではないコントローラーも参照します。このController:action表記は、コントローラーをサービスとして参照するために使用されます。

于 2012-11-10T10:50:17.483 に答える
1

ここには個人的な好みがたくさんあります。すでに行ったことは、コードベースを整理するための良い(十分な)ステップです。私のような人の中には、ある種のBaseControllerに注入するのではなく、さらに一歩進んでコントローラーをコンテナーに移動する人もいます。これは、SilexとフルスタックのSymfonyフレームワークの両方で発生します。

私のアドバイスは、持っているものをすべてそのままにして、BDDを実践して、次のコントローラーをサービスとして定義してみることです。

たとえば、UserControllerビューアクションの動作は次のとおりです。

  • データベースからユーザーを取得する必要があります
  • テンプレートを使用してユーザーをレンダリングする必要があります

コンテナからデータベースまたはテンプレートレンダラーを取得することについては一度も言及されていません。コンテナを注入しないのは快適なので、BDDによって必要と思われるものだけを注入します。

于 2012-11-15T14:41:16.903 に答える