Laravel

ルーティングとBlade

URLから画面ができるまでを追い、変更しやすいテンプレートを作りましょう。

01

ルートを定義する

routes/web.phpにHTTPメソッドとURL、処理を書きます。短い確認にはクロージャー、機能が増えたらコントローラーを使います。

routes/web.phpPHP
Route::get('/about', function () {
    return view('about');
});

Route::redirect('/old', '/about', 301);
確認COMMAND
php artisan route:list --path=about

ブラウザーで/aboutを開くと、resources/views/about.blade.phpが表示されます。URLを変更するときは、名前付きルートを使ってリンク側の修正を減らします。

02

URLの値を受け取る

{slug}のようなルートパラメーターでURLの一部を受け取れます。モデル名を使う暗黙のモデル結合では、見つからない場合に自動で404になります。

ルートとControllerPHP
Route::get('/posts/{post}', [PostController::class, 'show'])
    ->name('posts.show');

public function show(Post $post): View
{
    return view('posts.show', compact('post'));
}
リンクBLADE
<a href="{{ route('posts.show', ['post' => $post]) }}">
    {{ $post->title }}
</a>

管理者だけが使う画面なら、URLを知っているだけで表示できないようにミドルウェアやPolicyも追加します。

03

Controllerへ処理を分ける

Controllerはリクエストを受け、検証済みの値をモデルへ渡し、画面やリダイレクトを返す場所です。表示用のデータ取得と保存処理をメソッドごとに分けます。

作成コマンドCOMMAND
php artisan make:controller ArticleController --resource
一覧と詳細PHP
public function index(): View
{
    $articles = Article::latest()->paginate(10);
    return view('articles.index', compact('articles'));
}

public function show(Article $article): View
{
    return view('articles.show', compact('article'));
}
やりすぎに注意 Controllerへ認証、複雑な計算、外部API、HTML生成をすべて書くと保守しにくくなります。Form Request、Policy、Serviceへ責務を移す判断をします。
04

Bladeのレイアウトと表示

ページごとに同じHTMLを書く代わりに、レイアウトへ共通部分を集めます。{{ }}は値をHTMLエスケープして表示します。

layouts/app.blade.phpBLADE
<!doctype html>
<html lang="ja">
<body>
    <header>Note Board</header>
    <main>@yield('content')</main>
</body>
</html>
articles/index.blade.phpBLADE
@extends('layouts.app')

@section('content')
    <h1>記事一覧</h1>
    @foreach ($articles as $article)
        <h2>{{ $article->title }}</h2>
    @endforeach
@endsection

条件分岐は@if、繰り返しは@foreach、空の場合も含めるなら@forelseを使います。

05

コンポーネントで部品化する

ボタンや入力欄のように何度も使うHTMLはBladeコンポーネントへまとめます。見た目と属性の規則を一か所で管理できます。

作成と利用COMMAND / BLADE
php artisan make:component FormError

<x-form-error field="title" />

{{-- resources/views/components/form-error.blade.php --}}
@error($field)
    <p class="error">{{ $message }}</p>
@enderror
練習の視点 投稿一覧の「空の状態」、成功メッセージ、エラー表示を部品化し、別の画面でも同じ書き方で使えるようにしてみましょう。
PRACTICE

練習問題

商品一覧の/productsと詳細の/products/{product}を名前付きルートで定義し、一覧から詳細へ移動できるBladeを作ってください。

確認ポイント
  • route('products.show', $product)でURLを作る
  • 商品が0件のとき「商品がありません」と表示する
  • 商品名を{!! !!}ではなく{{ }}で表示する
  • 存在しない商品は404になる