本文へ移動
Laravel Tips

はじめての方へ・ステップ 9 / 12

コントローラーで整理する

ルートに書いていた処理を、コントローラーというクラスへ引っ越しします。リソースコントローラーで7つの決まった URL をまとめて作り、メモを1つずつ見るページも足します。

いまは、処理を routes/web.php のルートの中に直接書いています。ページが増えると、このファイルがどんどん長くなって読みにくくなります。そこで、処理をコントローラー(リクエストを受けて、何を返すかを決めるクラス)に引っ越しします。ルートのファイルには「どの URL を、どのコントローラーのどのメソッドに任せるか」だけを書くようにします。

コントローラーを作る#

ターミナルで次を実行します。

bash
php artisan make:controller MemoController --resource --model=Memo

app/Http/Controllers/MemoController.php ができます。

  • --resource を付けると、一覧・作成・保存・表示・編集・更新・削除の7つのメソッドが、最初から空っぽで用意されます。この形をリソースコントローラーと呼びます
  • --model=Memo を付けると、メソッドの引数に Memo $memo が書きこまれます(あとで説明します)

中を見ると、次のメソッドが並んでいます(説明のコメントは省いています)。

php
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 に置きかえます。

php
use App\Http\Controllers\MemoController;
use Illuminate\Support\Facades\Route;

// (/ や /hello のルートはそのまま)

Route::resource('memos', MemoController::class);

この1行で、メモのための7つのルートがまとめて作られます。ターミナルで確かめてみましょう。

bash
php artisan route:list --path=memos

次のような7行が出ます(実際の画面では、間が点線でつながっています)。

text
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 メソッドに、前のページでルートに書いていた処理を引っ越しします。

php
public function index()
{
    $memos = Memo::latest()->get();

    return view('memos.index', ['memos' => $memos]);
}

http://localhost:8000/memos を開いて、前と同じ一覧が出ればうまくいっています。

1つのメモを見せる(show)#

次に、メモを1つずつ見るページを作ります。show メソッドを次のように書きます。

php
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 を作ります。

blade
<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> の部分を書きかえます。

blade
<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日時点の内容をもとに、日本語でまとめています。

ページの一覧