Laravel如何获取含点符号的嵌套表单旧输入值?
解决Laravel中获取带有点符号的数组字段旧值问题
这个问题我之前也碰到过,Laravel的点符号解析逻辑在这里确实容易让人踩坑!
问题原因
你的字段名settings[custom_plan.breakpoint1]实际上是将settings作为一个一维数组,其中的键是带点的字符串custom_plan.breakpoint1,而不是嵌套数组settings['custom_plan']['breakpoint1']。直接使用old('settings[custom_plan.breakpoint1]')或old('settings.custom_plan\.breakpoint1')会让Laravel错误地将点符号解析为嵌套数组的层级分隔符,自然无法正确获取到目标值。
可行解决方法
方法1:直接从old数组中取值(带空值防护)
直接取出old('settings')返回的数组,然后访问带点的键名,同时用??运算符处理空值场景,避免报错:
{{ old('settings')['custom_plan.breakpoint1'] ?? '' }}
方法2:使用Arr::get辅助函数(更安全优雅)
Laravel的Arr::get工具函数可以安全地从数组中取值,自动处理数组或键不存在的情况,适合这种场景:
{{ Arr::get(old('settings'), 'custom_plan.breakpoint1', '') }}
第三个参数是默认值,这里设为空字符串,你可以根据需求修改。
方法3:修改字段名(可选)
如果项目允许修改表单字段名,建议将点符号替换为下划线或其他无歧义符号,比如settings[custom_plan_breakpoint1],这样就能直接用Laravel常规的点符号语法取值:
{{ old('settings.custom_plan_breakpoint1') }}
补充说明
你提到转义点在验证规则中有效,这是因为验证规则的解析逻辑支持通过转义点来表示实际的点字符;但old()函数的参数解析逻辑不同,转义的方式在这里无法生效,所以需要用上面的方法来绕过这个问题。
内容的提问来源于stack exchange,提问作者Giedrius
相关产品推荐
相关产品推荐

