Laravel シングルアクションコントローラの勧め

こんにちは。突然ですがLaravelのコントローラが肥大化して困っていませんか?コントローラは場合によってはかなり複雑な処理を含むことがあり、肥大化しやすいクラスです。今回は肥大化しがちなコントローラをシンプルに保つための解決方法としてシングルアクションのコントローラを作ることをお勧めします。

シングルアクションコントローラとは

シングルアクションコントローラとは、その名の通り、単一のアクションの実行にのみ責務を持つコントローラクラスです。publicメソッドを1つだけ持つように作り、ルーティングから呼び出せるメソッドは1つだけになります。この方法を採用するとアクションが増えるたびにコントローラクラスを作成していくことになります。

シングルアクションのコントローラの作り方は過去の記事をご参照ください。【Laravel】単一アクションのコントローラを作る

シングルアクションだとなぜ肥大化しないのか

肥大化しないのはコントローラクラスをアクションという最小単位で分割しているからです。よく見かける分割方法は、APIであればリソース単位、WEB画面であれば機能のまとまり単位です。この単位で作成すると、単純な機能であればよいのですが、複雑な機能はすぐにコントローラが肥大化して見通しが悪くなってしまいます。また、一つのクラスに機能を詰め込むことで、依存関係が強くなり、メンテナンス性も悪くなっていきます。

シングルアクションにするメリット

シングルアクションコントローラで作ることでコードの肥大化を防げることがわかりました。シングルアクションにすることでほかにも様々なメリットがあります。

  1. コードが肥大化しないので、可読性や検索性が向上する。
  2. クラスを細かく分けることで、影響範囲を局所化でき、メンテナンス性が向上する。
  3. 使わなくなったら削除しやすい。

1は言うまでもなく思いつくメリットですが、2、3は運用に入ってから実感するメリットです。特に3は重要です。肥大化したクラスから処理を削除するのは影響範囲が広くなるので場合によっては至難の業となります。

シングルアクションコントローラの課題

シングルアクションコントローラの良い面ばかり説明してきましたが、導入する場合はいくつか検討しなければならない課題があります。以下の事項は事前に検討して規約にまとめておかないと、混乱を招くことになるでしょう。

  1. フォルダ構成 (コントローラのクラス数が増えるので整理しやすいルールを事前に検討する)
  2. クラス名 (コントローラの命名が整っていないと非常に探しづらくなります)

1は、リソースや機能別のフォルダを用意し、その中にコントローラを作成する案が無難かと思います。実際そのルールで運用した経験もありますが、問題は起きませんでした。

2はアクション名をクラス名とすることになります。アクションなのでメソッドの命名ルールと同様でよいかと思います。基本は動詞+目的語の順番で命名し、動詞はよく使うものをリファレンス化しておけば十分です。

まとめ

今回はコントローラの肥大化を防止するためにアクション毎にコントローラを分割する提案をしました。私自身も最近はシングルアクションコントローラをよく使用しています。既に開発終盤や運用中のシステムの場合は、複雑なものだけでもクラスを分割してみると、メンテナンス性が向上すると思います。

Laravel

Posted by kobainmac