Laravel项目中获取TinyMCE内容及解决空对象赋值报错问题
Laravel集成TinyMCE后提交内容报错的解决方案
核心错误原因
“Attempt to assign property "Contenuto" on null” 表明 getTextByID($id) 返回了null,即根据传入的ID找不到对应的Text模型实例。结合代码和问题场景,主要问题出在模型查询逻辑,其次需确保表单数据正确传递。
分步解决方案
1. 修正模型查询逻辑
从注释的旧代码来看,数据库表的主键可能是text_id而非Laravel默认的id,这会导致Text::find($id)无法找到记录:
方法一:修改模型主键配置
在Text模型中指定主键字段:class Text extends Model { protected $primaryKey = 'text_id'; // 匹配数据库主键 protected $fillable = ['Contenuto']; // 允许直接赋值该字段 }之后
getTextByID方法可保留find($id)写法。方法二:修改查询语句
若不想修改模型,直接调整getTextByID的查询逻辑:public function getTextByID($id) { return Text::where('text_id', $id)->first(); }
2. 增加空值判断避免报错
在pageStore方法中,先检查查询结果是否存在,再执行更新:
public function pageStore($id, $contenuto) { $text = $this->getTextByID($id); // 无需重新实例化DataLayer,直接用$this调用自身方法 if (!$text) { throw new \RuntimeException("ID为{$id}的文本记录不存在"); // 或根据业务需求返回错误信息,比如:return false; } $text->Contenuto = $contenuto; $text->save(); }
3. 确保表单数据正确传递
- 你已给textarea添加
name="Contenuto",这一步正确,确保控制器能捕获字段值。 - 在控制器更新方法中,正确获取请求参数并验证:
public function update(Request $request, $id) { // 验证字段必填 $request->validate([ 'Contenuto' => 'required', ]); $dl = new DataLayer(); $dl->pageStore($id, $request->input('Contenuto')); return redirect()->back()->with('success', '内容已更新'); }
4. 验证TinyMCE内容同步
确保TinyMCE初始化正确,提交表单时内容同步到textarea:
tinymce.init({ selector: '#contenuto', // 其他配置项... setup: function (editor) { editor.on('submit', function () { editor.save(); // 强制编辑器内容同步到textarea }); } });
内容的提问来源于stack exchange,提问作者Gianandrea Bertocchi
相关产品推荐
相关产品推荐

