basercms5でのserviceとcomponentsの使い分けを教えて欲しいです。

basercms5からcakephpのコアバージョンが4になり、serviceが利用できるようになりました。

そのためcakephp4を勉強し始めたのですが、元々あったcomponentsの使い分けがいまいち分かりません。

自分が考えているのは以下です。

components

アプリケーション全体で使うような汎用的な処理「セッション管理」や「認証機能」等

service

コントローラ毎の固有のロジックを記述する場所?

basercms固有の問題ではないのでここで質問すべきでは無いかもしれませんが…

回答いただける大変助かります。

「いいね!」 2

こんにちわ。kagasawaと言います。私見含みますが私なりの考えでお答えします。

components

コンポーネントは再利用性を高める用途で考えてます。便利であれば他のアプリケーションでも再利用したくなるでしょうから、最終的にはプラグインにまとめる場合もあるでしょう。

service

私の場合は例えばredirect()やset()のようなcontrollerに依存するような処理以外、一般的にはビジネスロジックとか呼ばれるレイヤーになりますが、それらを全てServiceクラスに出します。
その理由はTESTです。例えば売上の合計計算処理をcontrollerで行うと、その計算処理が正しいかどうかをTESTで担保するには、書き出されたHTMLを解析しなければなりません。
これを解決するために、そういう計算処理をServiceクラスにまとめておいてreturnで返し、それをcontrollerで受け取ってセットするという流れにすることで、TESTが格段に書きやすくなります。
また、Serviceクラスに記述するコードは主にその案件に依存するビジネスロジックになりますので、他案件で再利用するようなケースは少ないです。

使い分けとしてはこんな感じですね。是非、他の方の意見も聞いてみたいところです。

「いいね!」 3

私の考えよりわかりやすい形でkagasawaさんが記載してくれてるし、反論が一切ないです。
baserCMSの実装においてはserviceレイヤーでは状態を持たないようにするということを注意して実装しているらしいです。
これによりbaserCMS4以前で難しかったController内部のテストが格段に書きやすくなり安定性が増したと思います。

「いいね!」 2

大変分かりやすいご説明ありがとうございます。
Fat Controllerになりやすいコードを書いてしまいがちなので、色々書いて実験してみようと思います。

gondohさんもありがとうございます。

「いいね!」 3