[laravel]UseCaseを使ってみた。

Laravel Laravel

LaravelでUseCaseを使ってみました!
掲示板のソースをUseCaseを使うように修正してみました。

UseCaseとは??

クリーンアーキテクチャという設計思想に基づいて、最近聞くようになった気がします。
UIとかフレームワークとビジネスロジックを分けて、テストをしやすくなるように開発する仕組みなようです。

個人的に設計思想とかは苦手なところですねー・・・
ちょっと難しい感じしますが、laravelでUseCaseに簡単に分けて書くことができるようなのでやってみました。

ソース

変更箇所が多岐にわたるので二つほど、載せてみます。

掲示板/初期表示のUseCase変更前

掲示板詳細ページの初期表示ロジックです。

掲示板の内容を取ってくる処理と、返信メッセージを取ってくる処理を行って
bladeの方に値を渡しています。

  • DetailPage.php
public function index(Request $request)
{
    /** @var Board|Collection $board */
    $board = new Board();
    $board_data = $board->find($request->id);

    /** @var Message|Collection $message */
    $message = new Message();
    $messages = $message->where('board_id', '=', $request->id)->get();

    return view("show_bbs", ['board' => $board_data, 'messages' => $messages]);
}

掲示板/初期表示のUseCase変更後

SelectDetailPageCase.phpというケースを作成して、idを渡してデータを取ってくるようにしています。
その後、取ってきたデータをbladeに渡してます。

Caseはコントローラの引数に渡すことで、簡単に呼び出せるようになります。
Caseを作るときは、メインメソッドは__invokeで定義しておかないとエラーになるようです。

  • DetailPage.php
public function index(Request $request, SelectDetailPageCase $case)
{
    list($board_data, $messages) = $case($request->id);
    return view("show_bbs", ['board' => $board_data, 'messages' => $messages]);
}
  • SelectDetailPageCase.php
<?php

namespace App\Http\UseCase\DetailPage;

use App\Model\Board;
use App\Model\Message;
use Illuminate\Support\Collection;

class SelectDetailPageCase
{
    public function __invoke($id)
    {
        /** @var Board|Collection $board */
        $board = new Board();
        $board_data = $board->find($id);

        /** @var Message|Collection $message */
        $message = new Message();
        $messages = $message->where('board_id', '=', $id)->get();

        return array($board_data, $messages);
    }
}

掲示板/レスポンス投稿のUseCase変更前

こちらも同じようにしています。
ここでの処理はレスを受けたものを保存して、oldで残すデータを設定後、viewにリダイレクトしています。

  • DetailPage.php
public function makeResponse(ResponseCreateRequest $request)
{
    /** @var Message|Collection $message */
    $message = new Message();
    $message->fill([
        'board_id' => $request->board_id,
        'user_name' => $request->user_name,
        'message' => $request->message
    ])->save();

    $request->flashOnly(['user_name']);
    return redirect()->route("detail.index", ["id" => $request->board_id]);
}

掲示板/レスポンス投稿のUseCase変更後

  • DetailPage.php
public function makeResponse(ResponseCreateRequest $request, CreateDetailPageCase $case)
{
    $case($request->board_id, $request->user_name, $request->message);
    $request->flashOnly(['user_name']);
    return redirect()->route("detail.index", ["id" => $request->board_id]);
}
  • CreateDetailPageCase.php
<?php

namespace App\Http\UseCase\DetailPage;

use App\Model\Message;
use Illuminate\Support\Collection;

class CreateDetailPageCase
{
    public function __invoke($board_id, $user_name, $param_message)
    {
        /** @var Message|Collection $message */
        $message = new Message();
        $message->fill([
            'board_id' => $board_id,
            'user_name' => $user_name,
            'message' => $param_message
        ])->save();
    }
}

github

おわりに

こんな感じでいいのかな。
ご指摘あればコメント欄からお願いします。🥺

参考リンク

コメント

タイトルとURLをコピーしました