浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

Service層を作って異なるインターフェースの処理を共通化する

 webサービスを作っていると時折、異なるインターフェースから同じようなことをしたくなる時があります。具体的にはAPI認証で通るコントローラとID、パスワードによる管理者ユーザ認証で通るコントローラで似た処理をする時です。こうなった時、複雑さを減らすにはService層を作るのがよいです。
 例えば、ユーザデータ(一般ユーザに関するデータのまとまり)の更新を考えます。データが許容する整合性を保つ最大範囲を自由に操作できるのが管理者ユーザで、自分のニックネームのみを変えられるのがAPIユーザとします。ユーザデータの保存処理の責務はユーザデータ自身の整合性を保つことであり、誰に操作されるかに関心を持ちません。そのためユーザデータの操作可能範囲はそれぞれのインターフェースのバリデーションに任せます(LaravelならFormRequest)。ここまでをそのまま実装すると次図の様にモデルに対する複雑な操作が複数発生して混乱のもとになります。

 対策としてService層を設けます。これが上手く働くと次図の様に複雑さが軽減されます。

 Controller : Service = n : 1 の関係になるぐらいがちょうどよく、Service層の恩恵にあずかれます。常に 1: 1 では余分なコードにほかならないのでService層は不要です。また絶対にしてはいけないのが n : n のServiceがControllerに依存しだすパターンです。こうなるとかえって複雑さが増します。

  • この記事いいね! (0)