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
おわりに
こんな感じでいいのかな。
ご指摘あればコメント欄からお願いします。🥺
参考リンク
Laravelで実践クリーンアーキテクチャ - Qiita
この記事を書くにあたって Laravel について色々サポートしてくれた皆さまに向けてお礼申し上げます。ありがとうございました。本記事はクリーンアーキテクチャに対する理解を深めていただくために、「…
【Laravel】「『Controllerに入る』と思ったならッ! その時スデに(ほぼ)ビジネスロジックは終わっているんだッ!」という、DIコンテナのお話 - Qiita
発端QiitadonでDIの話題が盛り上がっていた時に「LaravelのDIはつよい」みたいなことを書いたら一部反響があったので、その解説です。はじめにLaravelのDIコンテナ(サービスコ…
鵜呑みにしないで! —— 書籍『クリーンアーキテクチャ』所感 ≪null 篇≫ - 株式会社カブク
はじめに 最近よくクリーンアーキテクチャが話題になってて、関心が高まってる感じしますよね! ということでカブク
コメント