Laravel Blade索引页:路由、表单等语法正确性及问题咨询
Laravel Blade中route()与action()的适用场景及索引页语法说明
一、route() 和 action() 的适用场景分清楚
- route():靠路由名称生成URL,是日常开发的首选。只要你在路由定义时加了
->name('xxx'),就可以用route('路由名', 参数数组)生成链接。- 什么时候用:所有CRUD操作按钮(查看、编辑、删除)、页面跳转链接都用这个。好处是就算你改了路由的URI,只要名称不变,链接就不会崩。
- 示例:
href="{{ route('posts.edit', $post->id) }}"
- action():直接绑定控制器类和方法生成URL,不用管路由名称。Laravel 8+写法是
action([控制器类::class, '方法名'], 参数数组),旧版是action('控制器类@方法名', 参数数组)。- 什么时候用:临时测试、没给路由命名的场景,或者你更想直接指向控制器逻辑的时候用。
- 示例:
href="{{ action([PostController::class, 'edit'], $post->id) }}"
二、解决RouteNotFoundException的常见坑
- 路由没命名:用
route()的前提是路由必须有->name('xxx'),比如Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->name('posts.edit');,没加name就会报错。 - 参数传少了:路由里定义的参数(比如
{post})必须在route()的第二个参数里传全,漏了就找不到路由。 - 路由缓存搞的鬼:如果你跑过
php artisan route:cache,改完路由必须清缓存php artisan route:clear,不然旧缓存会让新路由找不到。 - 请求方法不匹配:比如删除路由定义的是DELETE方法,你直接用
href发GET请求肯定报错,必须用表单加@method('DELETE')来模拟DELETE请求。
三、带过滤、搜索、CRUD的索引页正确写法示例
1. 搜索过滤表单
<form method="GET" action="{{ route('posts.index') }}"> <div class="row"> <div class="col-md-4"> <input type="text" name="search" class="form-control" placeholder="搜标题" value="{{ request('search') }}"> </div> <div class="col-md-4"> <select name="category" class="form-control"> <option value="">全部分类</option> @foreach($categories as $category) <option value="{{ $category->id }}" {{ request('category') == $category->id ? 'selected' : '' }}> {{ $category->name }} </option> @endforeach </select> </div> <div class="col-md-4"> <button type="submit" class="btn btn-primary">筛选</button> <a href="{{ route('posts.index') }}" class="btn btn-secondary">重置</a> </div> </div> </form>
关键要点:
- 用GET方法提交,参数会挂在URL上,方便分享和分页时保留筛选条件
- 用
request('参数名')回显用户输入的内容,筛选后不会丢失状态 - 重置按钮直接跳回索引路由,清空所有筛选参数
2. CRUD操作按钮
<table class="table"> <thead> <tr> <th>ID</th> <th>标题</th> <th>操作</th> </tr> </thead> <tbody> @foreach($posts as $post) <tr> <td>{{ $post->id }}</td> <td>{{ $post->title }}</td> <td> <a href="{{ route('posts.show', $post->id) }}" class="btn btn-sm btn-info">查看</a> <a href="{{ route('posts.edit', $post->id) }}" class="btn btn-sm btn-warning">编辑</a> <form action="{{ route('posts.destroy', $post->id) }}" method="POST" class="d-inline"> @csrf @method('DELETE') <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('确定删?')">删除</button> </form> </td> </tr> @endforeach </tbody> </table>
关键要点:
- 查看、编辑用
route()生成GET链接,确保路由已命名 - 删除必须用POST表单,加
@csrf防跨站,@method('DELETE')模拟DELETE请求(Laravel路由默认删除是DELETE方法) - 用
d-inline(Bootstrap类)让删除按钮和其他按钮在同一行
3. 分页链接(保留筛选条件)
{{ $posts->appends(request()->query())->links() }}
关键要点:
appends(request()->query())会把当前的筛选参数挂到分页链接上,翻页后不会丢失筛选状态
总结
- 日常优先用
route(),路由名称比URI稳定,改URI也不会崩链接 - 遇到
RouteNotFoundException先查:路由有没有命名、参数传没传全、路由缓存清了没、请求方法对不对 - 索引页的搜索过滤用GET表单,CRUD操作严格对应路由的HTTP方法,分页记得保留筛选参数
内容的提问来源于stack exchange,提问作者adyyyty
相关产品推荐
相关产品推荐

