3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ラクスパートナーズAdvent Calendar 2023

Day 19

[Laravel]脱FatController

Last updated at Posted at 2023-12-18

はじめに

こんにちは。この記事はラクス Advent Calender 2023 19日目の記事です。
エンジニア歴1年で、現在はPHPのLaravelを使用して個人開発を行っています。
今までは何もわからず全てのコードをControllerに書いており、いわゆる典型的なFatControllerで修正のしにくいコードでした。
そこで、SkinnyControllerを目指すことにしました。

FatControllerとは

文字通り太った(記述量が多い)Controllerのことを指します。
Controllerはただ一つの責任だけを持たないといけないのに、複数の責任を持ってしまっている状態です。

これの何が問題なのかというと、「コードの可読性が落ちる」ことです。
コードが長すぎると、どこに処理を書いたのかがわからなくなります。
また、同じ処理を至る所で書いている場合が多く、改修漏れが生じやすくなってしまいます。
以下が今まで書いていたFatControllerの一部抜粋です。

PlayerController.php
public function index()
    {
        ...
        
        $player = Player::with('position')->orderBy('name')->get();


        return view('index', compact('player'));
    }

    public function select(Request $request)
    {
        ...

        $select = $request->select;

        if ($select == 1) {
            $player = Player::with('position')->orderBy('name')->get();
        } else if ($select == 2) {
            $player = Player::with('position')->orderBy('uniform_number')->get();
        }

        ...

        return view('index', compact('player'));
    }

このように同じコードを2回も書いてしまっています。

FatModel、SkinnyController化してみる

  • DBに関するロジックはModelクラスに入れる
Player.php
class Player extends Model
{
    public function getNamePlayer()
    {
        return $this->with('position')->orderBy('name')->get();
    }

    public function getUniformPlayer()
    {
        return $this->with('position')->orderBy('uniform_number')->get();
    }
}
  • ビジネスロジック(if文など)はServiceクラスを独自で作成し、その中に入れる
PlayerService.php
class PlayerService
{
    private $player;

//インスタンス化はコンストラクタに記入
    public function __construct()
    {
        $this->player = new Player();
    }

    public function selectPlayer($request)
    {
        $select = $request->select;

        if ($select == 1) {
            return $this->player->getNamePlayer();
        } else if ($select == 2) {
            return $this->player->getUniformPlayer();
        }
    }
  • メソッドをControllerで呼び出す
PlayerController.php
public function index()
{
    return view('index', ['player' => $this->player->getNamePlayer()]);
}

public function select(Request $request)
{
    return view('index',['player' => $this->service->selectPlayer($request)]);
}

それぞれのメソッドが一行で書けるようになりました。
name順に並んだplayerを取得したい場合に

$this->player->getNamePlayer();

を書くだけでどのControllerからも呼び出すことができ、nameではなく、別のカラムでsortしたい場合はModelクラスのメソッドのみを修正すればいいようになります。

まとめ

FatControllerを修正したことにより3つの利点があることに気づきました。

  • 1つ目は、文字通りControllerがスッキリしたことによりコードが見やすくなったこと。
  • 2つ目は、機能をメソッドごとにまとめることによって同じ機能を別のControllerでも使用できること。
    これにより何回も同じコードをいろんなところで書かなくて良くなります。
  • 3つ目は、改修漏れを減らすことができること。
    同じコードを何度もいろんなところで書かなくて済むことによって何か修正があった際にそのメソッドのみを変更するだけで済みます。

今回、脱FatControllerをしていく中で、コードがスッキリする以外にも改修漏れを減らせることを知りました。
今後も開発をする上でSkinnyControllerを意識しながらコードを書くようにしていきたい...!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?