2

コントローラクラス間で同じロジックを使用するために、コンポーネントを作成できます。しかし、カスタムクラスに対するコンポーネントの利点は何でしょうか?

別のクラス内にコントローラークラスのインスタンスを作成できます。したがって、$MyOtherController->myActionではなくで同じロジックを使用できます$this->MyComponent->myAction
それらを比較できますか?それとも私は何かが恋しいですか?

4

2 に答える 2

2

CakePHP のコンポーネントと動作は、基本的にデコレータ パターンのアプリケーションです。クラスをサブクラス化することで同じ結果が得られるとAppController考えるかもしれませんが、コンポーネントが使用される可能性のあるさまざまな組み合わせをすべて考慮すると、ほんの一握りと同じ結果を得るには、扱いにくい量のサブクラスを作成する必要があります。コンポーネントの。対照的に、依存性注入を使用して、コンポーネント/動作を自由に組み合わせて一致させることができます。

現在、3 つのコントローラー サブクラスがあるとします。

  1. MultiStepController
  2. SecurityController
  3. MultiStepSecurityController

追加したい新しいタイプのコントローラを思いついた場合は、4 つの新しいコントローラ サブクラスを作成する必要があります。

  1. FooMultiStepController
  2. FooSecurityController
  3. FooMultiStepSecurityController
  4. FooController

これは、コンポーネントを使用したいコントローラー'Foo'の変数に追加するだけに比べて、多くの冗長なコードと不要な作業です。$components

したがって、保守性とコードの再利用の観点からすると、ほとんどの場合、コンポーネントはサブクラス化よりもはるかに優れたソリューションです。

于 2012-07-26T01:08:40.847 に答える
1

コンポーネントクラスに関するドキュメント:

個々のコンポーネントの基本クラス。コンポーネントは、コントローラーに構成できる再利用可能なコントローラー ロジックのビットを提供します。コンポーネントは、特定の時点でロジックを挿入するためのリクエスト ライフサイクル コールバックも提供します。

コンポーネントは、リクエスト サイクルのさまざまな段階で起動されるいくつかのコールバックを提供できます。利用可能なコールバックは次のとおりです。

  • initialize() - コントローラーの beforeFilter メソッドの前に発生します。
  • startup() - コントローラーの beforeFilter メソッドの後に発生します。
  • beforeRender() - ビュー + レイアウトがレンダリングされる前に発生します。
  • shutdown() - アクションが完了し、ビューがレンダリングされた後、Controller::afterFilter() の前に発生します。
  • beforeRedirect() - redirect() が完了する前に発生します。

もちろん、これらすべてをカスタム クラスで実現することもできます (これはまだ単なる PHP です)。また、後で別のアプリでコンポーネントを再利用する方が、カスタム クラスを再利用するよりもはるかに簡単な場合があります。

詳細については、ドキュメントまたは (非常に役立つことが多い) APIを参照してください。

于 2012-07-25T21:09:29.403 に答える