2016-09-19 14 views
0

私はZend Frameworkの3で新しいアプリケーションを作成していると私は、に接続されるのように、いくつかのサービスを持つことになり非常に詳細で、このアプリケーションを入力せずにデザインパターンZend Frameworkの3つのシングルトン

について質問があります外部API、さらには複数のデータベースであっても、ワークフローは非常に複雑で、いくつかの外部情報(ユーザーがログインした場合など)に応じて、単一のアクションが複数のフローを持つことができます。

私は依存性注入とZend Framework 3 Service Managerについて知っていますが、特定のケースでフローが実際にわずかしか使用されないときに、serevalサービスのインスタンス化が心配です。また、他のサービスにも依存します。このために、私はシングルトンを使うことを考えていました。

ここでシングルトンは本当に解決策ですか?私はZend Framework 3でユーザシングルトンを使う方法を探していましたが、Service Managerのインスタンスを検索することができないため、サービス内のService Managerユーザを見つける方法が見つからないため、簡単な方法を見つけられませんでした。ファクトリシステムの外部にあります。

Zend Framework 3でシングルトンを実装する簡単な方法は何ですか?

答えて

2

なぜシングルトンを使用するのですか?

サービスマネージャからサービスを取得したときにのみ開始されるため、サービスマネージャでサービスが多すぎることを心配する必要はありません。

また、工場を除く別のクラスのサービスマネージャーを使用しないでください。 ZF3では、理由からコントローラから削除されています。それらの1つはテスト容易性です。すべてのサービスがファクトリでインジェクトされている場合は、テストを簡単に記述できます。また、来年にコードを読んだら、クラス内でどのような依存関係が必要かを簡単に知ることができます。

あなたは常にあなたができる必要ありませんクラス内に注入されて、あまりにも多くのサービスがある見つけた場合:

  • ProxyManagerを使用してください。この遅延はサービスをロードしますが、メソッドが呼び出されるまで開始しません。
  • サービスを分割する:サービスの一部を新しいサービスに移動します。例えばすべてをUserServiceに配置する必要はありません。 UserRegisterService、UserEmailService、UserAuthService、およびUserNotificationsServiceを持つこともできます。

ZF3の代わりに、zend-expressiveも考えられます。あまりにも詳細になることなく、軽量のミドルウェアフレームワークです。ミドルウェアを使用して、要求に必要なものを検出し、要求を処理するために必要なアクションにルーティングできます。このようなことはおそらくZF3でもやっているかもしれませんが、他の誰かがZF3のやり方を説明できるかもしれません。

+0

"サービスマネージャを工場以外の別のクラスにも使用しないでください。"しかし、依存関係を持つクラスの新しいインスタンスを作成する必要がある場合はどうすればよいですか?たとえば、モデル内のオブジェクト内の異なるデータを操作し、両方のオブジェクトが同じクラスであるとします。サービスマネージャにアクセスすることなく、私はすべてのinstanciatingプロセスに手動でする必要があります。私はまだこのようなことが必要ですが、将来の問題について心配しています。 –

+0

サービス内に別のサービスが必要な場合は、サービスにコンストラクタを挿入します。 他のクラスが関与していないときは、モデル内のデータを操作しません。データはサービスクラスで準備され、モデルに注入されます。 将来作成する必要がある工場の量が心配な場合は、それに慣れてしまう心配はありません。後で単体テストを書くときには感謝します。そして、「ブードゥー・トリック」(https://xtreamwayz.com/blog/2015-12-30-psr7-abstract-action-factory-one-for-all)がありますが、パフォーマンス上のペナルティがあります。 – xtreamwayz