You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('字段名')回显用户输入。
  • 重定向与提示:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 01:24:54