Laravel ミニブログ作成4 投稿のCRUD機能

投稿のコントローラーPostControllerを作成

sail artisan make:controller PostController

Read

投稿一覧(indexアクション) と 投稿詳細(showアクション)の登録

投稿一覧

  1. 現在ログイン中のユーザーに属するすべての投稿を取得し、作成日時が新しい順に並べ替える
    「現在ログイン中のユーザー」を取得するには、Authファサードを利用
    Auth::user()
  2. 1で取得した投稿を変数$postsに代入し、ビューに渡す
    Userモデルのインスタンス(ここではAuth::user())に対してposts()メソッドが使えるようになった理由は、ミニブログ作成3 投稿用テーブルとモデルでUserモデルとPostモデルのリレーションシップを設定したから。

投稿詳細

  • 補足:アクション内でモデルのインスタンスを受け取る
    アクションの引数でモデルの型宣言を行うと、アクション内でモデルのインスタンスを直接受け取ることができます。
    /routes/web.php
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');

/app/Http/Controllers/PostController

// Postモデルのインスタンスを受け取る
public function show(Post $post)
{
    return view('posts.show', compact('post'));
}

このようにモデルのインスタンスを直接受け取ることでコードが減り、可読性が上がります。

ただしこの場合、ビュー内においてroute()ヘルパ関数の第2引数にモデルのインスタンスを渡す必要があるので注意しましょう(ビューは次節で作成します)。

<a href="{{ route('posts.show', $post) }}">詳細</a>

 

app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use App\Models\Post;

class PostController extends Controller
{
+    // 一覧ページ
+    public function index()
+    {
+        $posts = Auth::user()->posts()->orderBy('created_at', 'desc')->get();
+
+        return view('posts.index', compact('posts'));
+    }

+     // 詳細ページ
+    public function show(Post $post)
+   {
+         return view('posts.show', compact('post'));
+    }
}

投稿詳細