CakePHP 3 で肥大化したコントローラを分割する方法

はじめに

CakePHP 3 でコントローラが肥大化することはありませんか?

コードが肥大化すると保守性が悪くなり、不具合も発生しやすくなります。

ビギナーの方にこそ分割化をオススメしたいのですが、慣れないうちは時間がかかってしまうため、つい後回しになりますよね。

今日はそんなビギナーの方にとってヒントになればと思い、コントローラを分割する際のアイディアをご紹介します。

目次
  1. コントローラを分ける
  2. モデルに分ける
  3. コンポーネントに分ける
  4. エンティティに分ける
  5. ヘルパーに分ける
  6. おわりに

1. コントローラを分ける

コントローラの各アクションをグルーピングできないかを考えます。

例えば、ネットショップの管理画面で、注文情報に関する機能(一覧、編集など)を集めた OrdersController に、注文メールに関するアクションも含まれている場合は、
それらを OrderMailsController に分割する方法が考えられます。

2. モデルに分ける

情報をデータベースから取得する処理では、よく使う条件をカスタム Finder メソッドにするのがオススメです。

実装方法などの詳細は、当ブログの「CakePHP 3 を使うなら「カスタム Finder メソッド」は知らなきゃ損!」でもご紹介しています。

3. コンポーネントに分ける

コンポーネントは、異なるコントローラ間で関数を共有するために使われますが、僕は機能をグループ化するために使用してもいいと考えています。

例えば、複数モデルにわたるデータの加工や保存を行う処理がある場合、コンポーネントにまとめると便利な時があります。
「便利」の判断は主観になりますが、個人プロジェクトで意見を聞ける人がいない場合は自己判断でいいと思います。

4. エンティティに分ける

郵便番号、TEL、FAX の各番号のハイフン繋ぎや、姓名の半角スペース繋ぎなどにはエンティティの仮想フィールドを使うと便利です。

仮想フィールドの使い方については、当ブログの「CakePHP 3 で仮想フィールドを使う方法と注意点」でもご紹介しています。

5. ヘルパーに分ける

税込・税抜価格の算出や、単位換算など、表示用に加工する機能で汎用的なものはヘルパーに実装すると良いです。

テンプレート側になるべくロジックは入れない、という教えもあって、コントローラに書いちゃうことありますよね。

6. おわりに

コントローラの肥大化はよくあることだと思います。特にビギナーの方にとっては効率的な分割はなかなか難しいと思います。

最初から最適解を求めると、先に進めなくなることがあります。

そんなときは、まずはアクションに書かれている処理の一部を外部関数化し、それをどこに置けばいいのかを考え、試行錯誤を重ねると良いと思います。