laravel のルーティング

(2025-02-25)

laravel のルーティングを深く追求することなく laravel を操作していました。

ブラックボックスは大きくても構わないとか屁理屈をこねて、そしてそれでも動くプログラムはコピーで作れるのでそれに安住していました。

今さらとは思いますが、laravel でいろいろ作る時にこれは絶対必要な知識なので記録しておきます。

web.php

まずは web.php。

Route::get('/rooms', [RoomController::class, 'roomlist'])->name('user.rooms');

これは、ローカルでは

http://127.0.0.1:8000/rooms

でアクセスした時の挙動を示しています。

RoomController というクラスの roomlist というメソッドを読み込んでその view を「user.rooms」でアクセスできるようにします。

とてもわかりにくい。

RoomController.php

今回は RoomController というコントローラに設定されているものを読み込みます。

おそらく、RoomController という class は唯一で重複はできないと思います。

app/Http/RoomController.php
<?php
class RoomController extends Controller
{
public function roomlist()
{
$rooms = Room::all();
return view('user.rooms', compact('rooms'));
}
}

ここに「RoomController」というクラスがあり「roomlist」というメソッドがあります。 これがコールされます。

ここで、

$rooms = Room::all();

は、データベースからモデルを通じてデータを取得して blade に渡すので本質的な問題ではないのですが、

return view('user.rooms', compact('rooms'));

ここでコールされるのは、resources/views/user/rooms.blade.php であることです。 なぜそうなのかというと、そういう規則だからです。

「user.rooms」は「views 内の user フォルダ内の rooms.blade.php という blade を読み込む」という約束なのです。

これもとてもわかりにくい。

つまり、resources/views/user/rooms.blade.php がないといけません。この blade の名前は何でもよく、resources/views/user/hoge.blade.php でも構いません。

rooms.blade.php

そうして rooms.blade.php を書きます。

resources/views/user/rooms.blade.php
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
ルーム一覧
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white shadow-md rounded-lg">
<div class="px-4 py-3 bg-gray-200 border-b border-gray-300 font-semibold">
ルーム一覧
</div>
<div class="px-4 py-6">
<!-- ルームが存在する場合の一覧表示 -->
@if($rooms->isNotEmpty())
<table class="min-w-full table-auto">
<thead>
<tr class="border-b">
<th class="px-4 py-2 text-left">ルーム名</th>
<th class="px-4 py-2 text-left">作成日</th>
</tr>
</thead>
<tbody>
@foreach ($rooms as $room)
<tr class="border-b">
<td class="px-4 py-2">{{ $room->name }}</td>
<td class="px-4 py-2">{{ $room->created_at->format('Y-m-d H:i') }}</td>
</tr>
@endforeach
</tbody>
</table>
@else
<p>ルームがまだ作成されていません。</p>
@endif
</div>
</div>
</div>
</div>
</x-app-layout>

dashboard.php などからアクセス

他の blade などからアクセスする際には、「‘user.rooms’」でできます。

<div>
<a href="{{ route('user.rooms') }}">
Roomページへ
</a>
</div>