index~全データ表示
データの一覧を表示させるルーティングとしてindexを使う。
前提
モデルデータの操作で準備した枠組みを使う。ユーザー認証機能を持ち、ユーザーごとに入力されたシンプルな投稿記事Postを扱う。
流れ
ドメイン名/postsをGETリクエストposts.indexルートでPostsControllerのindexアクションを実行indexアクションでログインユーザーの投稿記事を表示
indexアクションの呼び出し
リソースルーティングで以下のように設定されていて、GETメソッドによるリクエストの場合、ドメイン/postsからPostControllerのindexアクションにルーティングされる。ルーティング名はposts。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ php artisan route:list +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ ........ | | POST | posts | posts.store | App\Http\Controllers\PostController@store | web,auth | | | GET|HEAD | posts | posts.index | App\Http\Controllers\PostController@index | web,auth | | | GET|HEAD | posts/create | posts.create | App\Http\Controllers\PostController@create | web,auth | | | GET|HEAD | posts/{post} | posts.show | App\Http\Controllers\PostController@show | web,auth | | | DELETE | posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | web,auth | | | PUT|PATCH | posts/{post} | posts.update | App\Http\Controllers\PostController@update | web,auth | | | GET|HEAD | posts/{post}/edit | posts.edit | App\Http\Controllers\PostController@edit | web,auth | ........ |
コントローラー~indexアクション
ルーティングに従って、PostControllerのindexアクションを以下のように記述する。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class PostController extends Controller { ........ public function index() { $posts = Post::all(); return view('posts.index', [ 'title' => '投稿一覧', 'posts' => $posts, ]); } ........ } |
all()メソッドは、Postモデルのデータが保存されているpostsテーブルから全データを取得して配列として返す。つまりこの段階では、すべてのログインユーザーが他のユーザーのものも含めた全投稿を見られることになる。
Postクラスや継承元のModelクラスはall()メソッドを持たないが、store()アクションで見たのと同じようにModelクラスのマジックメソッドから呼び出していると思われる。
投稿記事の配列はresource/posts/index.blade.phpに'posts'として渡され、これがindexビューで$postsとして利用される。
表示ビュー
投稿表示はindex.blade.phpに以下の要領で記述。
|
1 2 3 4 5 |
@forelse ($posts as $post) <p>{{ $post->comment }} : {{ $post->created_at }}</p> @empty <p>投稿はありません。</p> @endforelse |
ここでは@forelseディレクティブで$postsに格納された投稿記事群を一つずつ取り出して、commentとcreated_at(datetime型)を表示させている。
$postsはindexアクションで読み込まれた投稿記事を格納した配列。
@forelseを使っているので、$postsが空の場合、つまり投稿が一つもされていない場合は、それに対応したメッセージが表示される。