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
おわりに
こんな感じでいいのかな。
ご指摘あればコメント欄からお願いします。🥺
参考リンク
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9TGFyYXZlbCVFMyU4MSVBNyVFNSVBRSU5RiVFOCVCNyVCNSVFMyU4MiVBRiVFMyU4MyVBQSVFMyU4MyVCQyVFMyU4MyVCMyVFMyU4MiVBMiVFMyU4MyVCQyVFMyU4MiVBRCVFMyU4MyU4NiVFMyU4MiVBRiVFMyU4MyU4MSVFMyU4MyVBMyZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZDA0MzY5ZDYxMDJkZTkyYjBlNTY1NzJlMzIyMTk0OTQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwbnJzbGliJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1jNTU1OTI4NTYwYmZkYzE1ZmI2MjMzZDQzMTA3ZmFmOA&blend-x=142&blend-y=491&blend-mode=normal&s=63a6587e6531e3ea2de8a2b3b6ed0f1f)
Laravelで実践クリーンアーキテクチャ - Qiita
この記事を書くにあたって Laravel について色々サポートしてくれた皆さまに向けてお礼申し上げます。ありがとうございました。本記事はクリーンアーキテクチャに対する理解を深めていただくために、「…
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9JUUzJTgwJTkwTGFyYXZlbCVFMyU4MCU5MSVFMyU4MCU4QyVFMyU4MCU4RUNvbnRyb2xsZXIlRTMlODElQUIlRTUlODUlQTUlRTMlODIlOEIlRTMlODAlOEYlRTMlODElQTglRTYlODAlOUQlRTMlODElQTMlRTMlODElOUYlRTMlODElQUElRTMlODIlODklRTMlODMlODMlRUYlQkMlODElMjAlRTMlODElOUQlRTMlODElQUUlRTYlOTklODIlRTMlODIlQjklRTMlODMlODclRTMlODElQUIlRUYlQkMlODglRTMlODElQkIlRTMlODElQkMlRUYlQkMlODklRTMlODMlOTMlRTMlODIlQjglRTMlODMlOEQlRTMlODIlQjklRTMlODMlQUQlRTMlODIlQjglRTMlODMlODMlRTMlODIlQUYlRTMlODElQUYlRTclQjUlODIlRTMlODIlOEYlRTMlODElQTMlRTMlODElQTYlRTMlODElODQlRTMlODIlOEIlRTIlODAlQTYmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWI3Y2M2MDdiYjUwMTU5NjNmMzgyMTk2MDMyMGNiYjRh&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwMHcwJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz00NTIyMDYyZTM4Yjg4ZTViZDY2NzllOWE3NDRkZDkyOA&blend-x=142&blend-y=491&blend-mode=normal&s=7f264d6f41e7307ec912295b4016990f)
【Laravel】「『Controllerに入る』と思ったならッ! その時スデに(ほぼ)ビジネスロジックは終わっているんだッ!」という、DIコンテナのお話 - Qiita
発端QiitadonでDIの話題が盛り上がっていた時に「LaravelのDIはつよい」みたいなことを書いたら一部反響があったので、その解説です。はじめにLaravelのDIコンテナ(サービスコ…
![](https://codelikes.com/wp-content/uploads/cocoon-resources/blog-card-cache/39f813873af939c73bce5ec99dd2c8f1.jpg)
鵜呑みにしないで! —— 書籍『クリーンアーキテクチャ』所感 ≪null 篇≫ - 株式会社カブク
はじめに 最近よくクリーンアーキテクチャが話題になってて、関心が高まってる感じしますよね! ということでカブク
コメント