Lumen中已声明变量仍触发未定义异常的问题排查求助
解决Lumen中Undefined variable: $postId异常问题
兄弟,你碰到的这个Undefined variable: $postId异常原因其实挺直白的——你在控制器的edit方法里,只把$post和$title通过compact()传给了视图,但视图模板里调用route()的时候,却用到了没传过去的$postId变量,这不就找不到变量报错了嘛。
给你两个靠谱的解决方案:
方案一:把$postId也传递给视图
直接修改控制器的edit方法,把$postId加入到compact的参数列表里,让视图能拿到这个变量:
public function edit(int $postId): View { $post = app('db')->table(Posts::TABLE)->select('*')->where(Posts::PK, $postId)->first(); $title = $this->_titleEdit; // 把$postId也加入要传递的变量集合 return view('posts.edit', compact('post', 'title', 'postId')); }
方案二:从已有的$post对象中获取主键(更推荐)
既然你已经从数据库里取出了$post对象,它本身就包含了主键字段(也就是你定义的Posts::PK = 'id'),所以完全不用额外传$postId,直接在视图里用$post的主键值就行:
<form action="<?=route('posts.update',['postId' => $post->id]) ?>" method="post">
要是想更贴合你定义的常量,避免硬写id,也可以这么写:
<form action="<?=route('posts.update',['postId' => $post->{Posts::PK}]) ?>" method="post">
额外小提醒
咱最好在控制器里加个判断,防止传入的$postId对应的数据不存在导致$post为null,后续操作出问题:
public function edit(int $postId): View { $post = app('db')->table(Posts::TABLE)->select('*')->where(Posts::PK, $postId)->first(); // 找不到对应帖子就抛出404异常 if (!$post) { abort(404); } $title = $this->_titleEdit; return view('posts.edit', compact('post', 'title')); }
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

