Laravel编辑数据时出现Undefined variable: id错误是什么原因?
问题修复及原理说明
核心报错原因
你触发的Undefined variable: id错误,完全是视图语法误用导致的:
在edit.blade.php的表单action定义中,你写的是$post->$id,这里多写了一个$符号:
- 正常访问Eloquent模型的
id属性,写法是$post->id,此处id是模型的固定属性名,不需要加$ - 写成
$post->$id属于PHP的「可变属性」用法:PHP会先尝试读取$id这个变量的值,再把该值作为属性名去访问$post的对应属性,而你从控制器传给视图的只有$post变量,没有单独传递$id变量,自然会报变量未定义的错误。
其他隐藏问题
1. 表单请求方法错误
HTML原生表单仅支持GET、POST两种请求方式,就算你写method="PUT"也不会生效,Laravel的resource路由中update方法默认匹配PUT请求,需要手动添加伪方法指令声明请求类型。
2. 控制器update方法调用错误
你写的$post::update($request->validated());是静态调用,会直接触发Post模型的静态更新方法,没有指定更新条件的前提下甚至会更新全表数据,你已经通过findOrFail拿到了单条记录的实例,应该调用实例的更新方法。
3. 表单回填值写错
url_clean输入框的旧值回填你写的是old('content', $post->url_clean),第一个参数应该对应字段名url_clean,否则提交后校验失败时该字段无法正常回填旧值。
完整修复方案
第一步:修改edit.blade.php
@extends('dashboard.master') @section('content') @include('dashboard.partials.validation-error') {{-- 修复action语法、请求方法,添加@method指令 --}} <form action="{{ route("post.update", $post->id) }}" method="POST"> @csrf @method('PUT') <div class="form-group"> <label for="title">Título</label> <input class="form-control" type="text" name="title" id="title" value="{{ old('title', $post->title) }}"> @error('title') <small class="text-danger"> {{ $message }} </small> @enderror </div> <div class="form-group"> <label for="url_clean">Url limpia</label> {{-- 修复old的字段名参数 --}} <input class="form-control" type="text" name="url_clean" id="url_clean" value="{{ old('url_clean', $post->url_clean) }}"> </div> <div class="form-group"> <label for="content">Contenido</label> <textarea class="form-control" type="text" name="content" id="content" rows="3"> {{ old('content', $post->content) }} </textarea> </div> <input type="submit" class="btn btn-primary" value="Enviar"> </form> @endsection
第二步:修改PostController的update方法
public function update(Request $request, $id) { $post = Post::findOrFail($id); // 把静态调用::改成实例调用-> $post->update($request->validated()); return back()->with('status', '¡Post editado con éxito!'); }
关于自定义主键的说明
你选择不用路由模型绑定的入门写法完全合理,就算后续你把Post模型的主键改成非id的字段(比如post_id),只需要把$post->id改成对应属性名$post->post_id即可,和当前写法完全兼容。
内容的提问来源于stack exchange,提问作者El conde Lucanor
相关产品推荐
相关产品推荐

