はじめての方へ・ステップ 9 / 12
コントローラーで整理する
ルートに書いていた処理を、コントローラーというクラスへ引っ越しします。リソースコントローラーで7つの決まった URL をまとめて作り、メモを1つずつ見るページも足します。
いまは、処理を routes/web.php のルートの中に直接書いています。ページが増えると、このファイルがどんどん長くなって読みにくくなります。そこで、処理をコントローラー(リクエストを受けて、何を返すかを決めるクラス)に引っ越しします。ルートのファイルには「どの URL を、どのコントローラーのどのメソッドに任せるか」だけを書くようにします。
コントローラーを作る#
ターミナルで次を実行します。
php artisan make:controller MemoController --resource --model=Memo
app/Http/Controllers/MemoController.php ができます。
--resourceを付けると、一覧・作成・保存・表示・編集・更新・削除の7つのメソッドが、最初から空っぽで用意されます。この形をリソースコントローラーと呼びます--model=Memoを付けると、メソッドの引数にMemo $memoが書きこまれます(あとで説明します)
中を見ると、次のメソッドが並んでいます(説明のコメントは省いています)。
class MemoController extends Controller
{
public function index() { /* 一覧 */ }
public function create() { /* 作成のフォーム */ }
public function store(Request $request) { /* 保存 */ }
public function show(Memo $memo) { /* 1つを表示 */ }
public function edit(Memo $memo) { /* 編集のフォーム */ }
public function update(Request $request, Memo $memo) { /* 更新 */ }
public function destroy(Memo $memo) { /* 削除 */ }
}
ルートを1行にまとめる#
routes/web.php を開き、前のページで書いた /memos のルートを消して、代わりに次の1行を書きます。いちばん上の use App\Models\Memo; の行も、MemoController の use に置きかえます。
use App\Http\Controllers\MemoController;
use Illuminate\Support\Facades\Route;
// (/ や /hello のルートはそのまま)
Route::resource('memos', MemoController::class);
この1行で、メモのための7つのルートがまとめて作られます。ターミナルで確かめてみましょう。
php artisan route:list --path=memos
次のような7行が出ます(実際の画面では、間が点線でつながっています)。
GET|HEAD memos memos.index › MemoController@index
POST memos memos.store › MemoController@store
GET|HEAD memos/create memos.create › MemoController@create
GET|HEAD memos/{memo} memos.show › MemoController@show
PUT|PATCH memos/{memo} memos.update › MemoController@update
DELETE memos/{memo} memos.destroy › MemoController@destroy
GET|HEAD memos/{memo}/edit memos.edit › MemoController@edit
左から、リクエストの種類、URL、ルートの名前、受け持つメソッドです。
| リクエスト | すること |
|---|---|
GET /memos |
index:一覧を見せる |
GET /memos/create |
create:作成のフォームを見せる |
POST /memos |
store:送られたメモを保存する |
GET /memos/{memo} |
show:1つのメモを見せる |
GET /memos/{memo}/edit |
edit:編集のフォームを見せる |
PUT /memos/{memo} |
update:直したメモを保存する |
DELETE /memos/{memo} |
destroy:メモを消す |
memos.index などのルートの名前は、あとで URL を組み立てるときに使います。
一覧を作る(index)#
MemoController の index メソッドに、前のページでルートに書いていた処理を引っ越しします。
public function index()
{
$memos = Memo::latest()->get();
return view('memos.index', ['memos' => $memos]);
}
http://localhost:8000/memos を開いて、前と同じ一覧が出ればうまくいっています。
1つのメモを見せる(show)#
次に、メモを1つずつ見るページを作ります。show メソッドを次のように書きます。
public function show(Memo $memo)
{
return view('memos.show', ['memo' => $memo]);
}
引数が Memo $memo になっているのがポイントです。URL が /memos/1 なら、Laravel が id が 1 のメモを自動で探して、$memo に入れて渡してくれます。見つからなければ、自動で「404 Not Found」(ページが見つからない)を返します。このしくみをルートモデル結合と呼びます。自分で Memo::find($id) と書かなくてよいので便利です。
resources/views/memos/show.blade.php を作ります。
<x-layout>
<x-slot:title>{{ $memo->title }}</x-slot>
<h1>{{ $memo->title }}</h1>
@if ($memo->body)
<p style="white-space: pre-wrap">{{ $memo->body }}</p>
@else
<p>(本文はありません)</p>
@endif
<p>作った日時:{{ $memo->created_at->format('Y年n月j日 H:i') }}</p>
<p><a href="{{ route('memos.index') }}">一覧へ戻る</a></p>
</x-layout>
style="white-space: pre-wrap"は、本文の改行をそのまま見せるための HTML の書き方ですroute('memos.index')は、memos.indexという名前のルートの URL(http://localhost:8000/memos)を作ります
一覧から詳しいページへリンクする#
一覧の <li> を、タイトルを押すと詳しいページへ行くように変えます。resources/views/memos/index.blade.php の <li> の部分を書きかえます。
<li>
<a href="{{ route('memos.show', $memo) }}">{{ $memo->title }}</a>
({{ $memo->created_at->format('n月j日 H:i') }})
</li>
route('memos.show', $memo) は、/memos/{memo} の {memo} に、そのメモの id を入れた URL を作ります。
一覧でタイトルを押して、メモが1つずつ見られれば成功です。http://localhost:8000/memos/999 のように、無い番号を開くと「404 Not Found」になることも確かめてみましょう。
ヒント
URL を '/memos/'.$memo->id のように自分でつなげて作ることもできますが、route() で名前から作っておくと、あとで URL の形を変えたときに、リンクを1つずつ直さなくてすみます。
コントローラーのくわしい話はコントローラーに、ルートモデル結合はルーティングに、URL の作り方は URL を作るにまとめています。
次に読むページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。