ルートを定義する
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を変更するときは、名前付きルートを使ってリンク側の修正を減らします。
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も追加します。
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へ責務を移す判断をします。
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を使います。
コンポーネントで部品化する
ボタンや入力欄のように何度も使う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練習の視点 投稿一覧の「空の状態」、成功メッセージ、エラー表示を部品化し、別の画面でも同じ書き方で使えるようにしてみましょう。
練習問題
商品一覧の/productsと詳細の/products/{product}を名前付きルートで定義し、一覧から詳細へ移動できるBladeを作ってください。
確認ポイント
route('products.show', $product)でURLを作る- 商品が0件のとき「商品がありません」と表示する
- 商品名を
{!! !!}ではなく{{ }}で表示する - 存在しない商品は404になる
