Laravel中domainPage变量未定义、ID为空问题排查求助
这问题确实有点反常——明明表单action里能拿到ID,但dd($domainPage->id)却提示变量未定义,大概率是路由模型绑定的细节没处理对,咱们一步步捋:
1. 核心问题:路由模型绑定参数不匹配
你用了Route::resource('domain', 'Admin\DomainPageController'),Laravel的resource路由会自动生成/domain/{domain}/edit这样的URL,这里的路由占位符是{domain}。
而你的控制器edit方法参数是DomainPage $domainPage——Laravel的路由模型绑定默认是根据参数名称匹配路由占位符的,也就是说参数名得和占位符一致,否则Laravel没法从URL里取到ID去查询对应模型,只会生成一个空的DomainPage实例。
至于你说表单action里能看到ID,很大概率是视图缓存的旧内容在搞鬼,之前的代码是正常的,改了参数名后没清缓存导致显示异常。
解决办法:把控制器参数名改成和路由占位符一致的$domain:
public function edit(DomainPage $domain) { return view('admin.domains.edit', ['domainPage'=> $domain]); }
2. 清缓存!解决玄学问题
Laravel的视图/路由缓存经常会制造“明明改了代码却没生效”的诡异情况,先把缓存清干净:
php artisan view:clear php artisan route:clear php artisan cache:clear
3. 验证控制器是否拿到正确模型
在控制器里先打个dump,确认模型绑定是否生效:
public function edit(DomainPage $domain) { dd($domain); // 看看这里有没有输出正确的模型数据 return view('admin.domains.edit', ['domainPage'=> $domain]); }
如果这里输出的是空模型,那肯定是路由绑定的问题;如果这里有数据,那就要检查视图里的变量是否写错了,或者@include的表单视图有没有干扰变量。
4. 确认路由参数是否正确传递
在视图里先打印路由参数,看看URL里的ID有没有传进来:
{{ dd(request()->route('domain')) }}
如果这个有值,那就是模型绑定没关联到参数;如果这个是空的,那就是URL本身有问题,检查你访问的编辑页面URL是不是/domain/{id}/edit格式。
内容的提问来源于stack exchange,提问作者Mikheil Akopov

