8、Laravel 11 路由参数与模型绑定

作者: 温新

图书: 【Laravel 11 构建 Web 应用与管理后台】

阅读: 126

时间: 2024-05-17 21:58:02

上篇文章中,我们通过在 URL 中拼接参数的方式实现了按照分类查询文章的功能。

本篇文章,我们通过查看文章来实现另外一种查询。

路由参数

1、创建文章控制器

$ php artisan make:controller PostController

2、显示文章

app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use App\Models\Post;

class PostController extends Controller
{
    public function show(int $postId)
    {
        $post = Post::find($postId);

        return view('post', compact('post'));
    }
}

在控制器中,我们定义一个 show 方法来显示文章详情。

3、定义路由

routes/web.php

...
    
use App\Http\Controllers\PostController;

...
// 定义路由并指定参数
Route::get('posts/{postId}', [PostController::class, 'show'])->name('post.show');

注意:Route 中的参数名 postId 应该与控制器方法中使用的变量名相同。

4、添加视图文件

resources/views/post.blade.php

@extends('layouts.app')

@section('content')
    <!-- Page header with logo and tagline-->
    <header class="py-5 bg-light border-bottom mb-4">
        <div class="container">
            <div class="text-center my-5">
                <h1 class="fw-bolder">{{ $post->title }}</h1>
            </div>
        </div>
    </header>
    <!-- Page content-->
    <div class="container mb-4">
        <div class="row">
            <!-- Blog entries-->
            <div class="col-lg-12">
                <p class="lead mb-0">{{ $post->text }}</p>
            </div>
        </div>
    </div>
@endsection

5、查看文章详情

现在我们就可以通过 http://b-laravel11-blog.test/posts/1 的形式来查看文章详情了。

模型绑定

上面方法是通过传递参数,然后我们根据 postID 进行显示查询的方式查询文章。

在 Laravel 中,我们可以通过模型绑定的方式更优雅的实现文章的查询。

1、修改路由,通过模型绑定实现

routes/web.php

...
    
// 注意,参数变成了 post
Route::get('posts/{post}', [PostController::class, 'show'])->name('post.show');

2、控制器绑定

app/Http/Controllers/PostController.php

...

public function show(Post $post)
{
    return view('post', compact('post'));
}

在 show 方法中,我们使用了模型对象,并将参数定义为 $post,这样就自动实现了数据的查询。

修改视图

手动查看文章详情太费劲了。我们修改下视图。

resources/views/home.blade.php

...

<!-- Nested row for non-featured blog posts-->
<div class="row">
    @foreach($posts as $post)
        <div class="col-lg-6">
            <!-- Blog post-->
            <div class="card mb-4">
                <a href="{{ route('post.show', $post) }}"><img class="card-img-top" src="https://dummyimage.com/700x350/dee2e6/6c757d.jpg" alt="..." /></a>
                <div class="card-body">
                    <div class="small text-muted">{{ $post->created_at }}</div>
                    <h2 class="card-title h4">{{ $post->title }}</h2>
                    <p class="card-text">{{ $post->text }}</p>
                    <a class="btn btn-primary" href="{{ route('post.show', $post) }}">查看 →</a>
                </div>
            </div>
        </div>
    @endforeach
</div>

...

在 route() 辅助函数中,路由的参数作为第二个参数传递。该参数可以作为一个完整对象传递,也可以通过 $post->id 显式传递 ID,具体取决于你的个人喜好。

现在, 当我们访问主页时,就可以点击文章就行阅读了。

请登录后再评论