Laravel:Item模型CRUD的资源控制器与Web路由优雅实现(auth中间件)
Laravel Item资源控制器实现与路由配置
一、路由注册(auth中间件组内)
在routes/web.php中用资源路由替代零散路由,自动生成RESTful风格路由,同时包裹在auth中间件组内确保仅登录用户可访问:
Route::middleware('auth')->group(function () { // 自动生成index/create/store/edit/update/destroy对应路由 Route::resource('items', \App\Http\Controllers\ItemController::class); });
执行php artisan route:list可查看所有生成的路由及对应方法。
二、规范的ItemController实现
首先确保Item模型已设置$fillable属性(允许批量赋值的字段):
// app/Models/Item.php class Item extends Model { use HasFactory; protected $fillable = ['name', 'description']; // 根据实际字段调整 }
完整控制器代码(app/Http/Controllers/ItemController.php):
namespace App\Http\Controllers; use App\Models\Item; use Illuminate\Http\Request; class ItemController extends Controller { // 列表展示 public function index() { // 按创建时间倒序,分页展示(每页10条) $items = Item::latest()->paginate(10); return view('items.index', compact('items')); } // 渲染创建表单 public function create() { return view('items.create'); } // 保存新Item数据 public function store(Request $request) { // 数据验证规则,按需调整 $validatedData = $request->validate([ 'name' => 'required|string|max:255|unique:items', // 需唯一则加unique规则 'description' => 'nullable|string|max:1000', // 其他字段示例:price: 'required|numeric|min:0' ]); Item::create($validatedData); // 重定向到列表页并携带成功提示 return redirect()->route('items.index')->with('success', 'Item创建成功'); } // 渲染编辑表单 public function edit(Item $item) { // 路由模型绑定自动查找对应Item,不存在则返回404 return view('items.edit', compact('item')); } // 更新Item数据 public function update(Request $request, Item $item) { // 验证规则,unique需排除当前Item自身 $validatedData = $request->validate([ 'name' => 'required|string|max:255|unique:items,name,' . $item->id, 'description' => 'nullable|string|max:1000', ]); $item->update($validatedData); return redirect()->route('items.index')->with('success', 'Item更新成功'); } // 删除Item public function destroy(Item $item) { $item->delete(); return redirect()->route('items.index')->with('success', 'Item删除成功'); } }
三、关键细节说明
- 路由模型绑定:edit/update/destroy方法直接注入
Item $item,Laravel自动根据路由id参数查找模型,无需手动写Item::findOrFail($id)。 - 验证逻辑:
- store方法的
unique规则确保字段唯一性; - update方法的
unique规则排除当前Item,避免更新时触发唯一性校验错误; - 验证失败时自动重定向回表单页,可通过
old('字段名')回显用户输入。
- store方法的
- 重定向与提示:用
redirect()->route('items.index')统一跳转列表页,with('success', ...)存入session的提示信息,可在视图中用@if(session('success'))展示。
四、极简视图示例
items/index.blade.php
<h1>Item列表</h1> <a href="{{ route('items.create') }}">创建新Item</a> @if(session('success')) <div class="alert alert-success">{{ session('success') }}</div> @endif <table> <thead> <tr> <th>名称</th> <th>描述</th> <th>操作</th> </tr> </thead> <tbody> @foreach($items as $item) <tr> <td>{{ $item->name }}</td> <td>{{ $item->description }}</td> <td> <a href="{{ route('items.edit', $item) }}">编辑</a> <form action="{{ route('items.destroy', $item) }}" method="POST" style="display:inline;"> @csrf @method('DELETE') <button type="submit" onclick="return confirm('确定删除?')">删除</button> </form> </td> </tr> @endforeach </tbody> </table> {{ $items->links() }} <!-- 分页链接 -->
items/create.blade.php
<h1>创建Item</h1> <form action="{{ route('items.store') }}" method="POST"> @csrf <div> <label>名称:</label> <input type="text" name="name" value="{{ old('name') }}" required> @error('name') <span class="text-danger">{{ $message }}</span> @enderror </div> <div> <label>描述:</label> <textarea name="description">{{ old('description') }}</textarea> @error('description') <span class="text-danger">{{ $message }}</span> @enderror </div> <button type="submit">创建</button> </form>
items/edit.blade.php
<h1>编辑Item</h1> <form action="{{ route('items.update', $item) }}" method="POST"> @csrf @method('PUT') <div> <label>名称:</label> <input type="text" name="name" value="{{ old('name', $item->name) }}" required> @error('name') <span class="text-danger">{{ $message }}</span> @enderror </div> <div> <label>描述:</label> <textarea name="description">{{ old('description', $item->description) }}</textarea> @error('description') <span class="text-danger">{{ $message }}</span> @enderror </div> <button type="submit">更新</button> </form>
内容的提问来源于stack exchange,提问作者Sasugae
相关产品推荐
相关产品推荐

