8、Laravel 11 路由参数与模型绑定
上篇文章中,我们通过在 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,具体取决于你的个人喜好。
现在, 当我们访问主页时,就可以点击文章就行阅读了。
请登录后再评论