環境
Laravel v9.5.1 (PHP v8.1.3)
Bad
$request
をそのまま引数として渡してしまっているのが問題。
引数1つで済むからいっか!とやってしまっていた。
app/Http/Controllers/Api/PostController.php
public function store(PostRequest $request)
{
$request->user()->givePost($request);
return response()->json(Response::HTTP_OK);
}
app/Models/User.php
public function givePost(Request $request): Post
{
$post = $this->createPost($request->content, $request->title);
// このあとの処理は省略
return $post;
}
教訓:Request
をそのままコントローラー以外に渡さない!
渡すには大きすぎるという例えで分かりやすかったのが、ホームセンターの例。
庭に木を植えたいとしたら、ホームセンターに売ってる木だけほしいのにホームセンターごと渡されてるようなものらしい。
そりゃデカいわと納得!
Better
$request
の中の何を渡すのかを明示する。
この場合は下記
$request->content
$request->title
app/Http/Controllers/Api/PostController.php
public function store(PostRequest $request)
{
$user->givePost($request->content, $request->title);
return response()->json(Response::HTTP_OK);
}
app/Models/User.php
public function givePost(string $content, string $title): Post
{
$post = $this->createPost($content, $title);
// このあとの処理は省略
return $post;
}