Laravel Collective FormBuilder复选框选中的状态带有错误的(旧)值

时间:2018-10-24 20:50:49

标签: php laravel laravel-5.3 formbuilder laravelcollective

我将尽力详细解释我的问题。我发现了类似的问题,但根本没有描述我的情况。我不确定这是否有解决方案,可能是第三方错误。但是,让我们尝试一下。预先感谢!

上下文

  • Laravel 5.3
  • 使用LaravelCollective FormBuilder创建的编辑表单
  • 一个具有名为“ required”的布尔属性的模型(待编辑)
  • 使用Form::checkbox和上述模型创建的复选框

核心问题

从模型中打开一个具有名为“ required”的布尔属性的编辑表单,并且未选中应选​​中的复选框。如果我按F5,则该复选框显示为选中状态。

原因

根据Laravel Collective Documentation

  

如果会话闪存数据中有一个与输入名称匹配的项目,则该项目将优先于模型的值。因此,优先级如下所示:

     
      
  1. 会话Flash数据(旧输入)
  2.   
  3. 明确传递的价值
  4.   
  5. 模型属性数据
  6.   

我可以确认原来的输入在搞乱,但我不完全明白为什么。 FormBuilder按顺序调用以下函数:

  1. checkbox()
  2. checkable()
  3. getCheckedState()
  4. getCheckboxCheckedState()

最后一个条件验证如下:

    if (isset($this->session) && ! $this->oldInputIsEmpty() && is_null($this->old($name))) {
        return false;
    }

那么,为什么oldInputIsEmpty()返回false?为什么old("required")为null?因为在上一个视图(访问编辑表单之前的视图)上,存在另一种表单,该表单没有名为“ required”的属性,而是用于过滤包含该模型的记录的列表。表单输入值将保留在会话(old_input)中,并携带到编辑表单中。

结论(和主要问题)

基本上,如何避免这种情况发生? 这种行为是故意的吗?还是没有人想到表格是后续表格?

0 个答案:

没有答案