開発者、永遠のテーマであるアーキテクチャ。
自身ではMVCがシンプルで拡張性も高く好きです。
先日開催された「PHPカンファレンス福岡2015」で発表されたスライドを引用させてもらいます。
CakePHPを土台に作る事が多い+改修などでも出会う機会が増えてきました。
割りと制約が多い方に部類されるCakePHPでも、それぞれ特徴が出たり、ありがちなControllerにビジネスロジックがごっそり入っているパターンだったり、Modelにビジネスロジックが入っていてもシステムが大きくなる程に、役割や責任の範囲が曖昧になり、巨大なModelの出来上がりとなるのは「開発あるある」ではないでしょうか。
スライドにあるような、レイヤーにサービス層を入れる事で、Facadeパターンを取り入れたような設計ができます。
ちなみにCakePHP2系でパッケージを追加するのは簡単です。
app/Config/bootstrap.php
App::build(array( 'Service' => array('%s' . 'Service' . DS) ), App::REGISTER); |
で追加して、下記のように呼び出せます。
app/Controller/HogeController.php
App::uses('FugaService', 'Service'); |
ControllerはHTTPリクエストの操作、Viewの呼び出し、Service実行のみを行う。
Serviceはリクエストの検証、ビジネスロジック。Model実行。
Modelはバリデーション、DB操作のみを行う。ORマッパ経由でもServiceレイヤーには書かない。
Viewはロジックを入れないでとか、データ加工ならHelperとかElementを上手く使って。
これだけでも後から見たり、人が増えたりしても仕様理解が早く済む。と思っています。
これからはCakePHP3が既にリリースされているので、新機能との合わせ技で試行錯誤してみたいですね。
PHP7のリリースも迫っていて、楽しみ半分、大変そうです。