Laravel request()输入文件和隐藏的同名输入

时间:2018-02-27 15:04:22

标签: php laravel file input request

我简化了这个问题的表格。

这是我的例子

<form method="post" name="test" enctype="multipart/form-data">
   {{csrf_field()}}
   <input class="form-control" type="file" name="test[]" id="companion"/>
   <input type="hidden" name="test[]" value="random-value" />
   <input type="submit" value="Submit">
</form>

在我的路线中,只需 dd 请求如下:

dd(request('test'));

现在我希望有一个带有文件的数组(UploadedFile类型)和 random-value ,相反,我只得到文件。

array:1 [▼
   0 => UploadedFile {#539 ▶}
]

知道为什么我得到这个结果? 我知道我可以更改变量的名称,但我想知道为什么它不能像那样工作。

提前致谢。

2 个答案:

答案 0 :(得分:2)

因为:

  1. 您致电request('test')。这在Illuminate\Foundation\helpers.php

    中调用了帮助者
    function request($key = null, $default = null)
    {
        ...
        $value = app('request')->__get($key);
        ...
    }
    
  2. 这会将调用定向到__get方法,以便快速获取Illuminate\Http\Request.php

    中的值
    public function __get($key)
    {
        if (array_key_exists($key, $this->all())) {
            return data_get($this->all(), $key);
        }
        ...
    }
    
  3. 问题出在特质Illuminate\Http\Concerns\InteractsWithInput

    中定义的all()方法
    public function all($keys = null)
    {
        $input = array_replace_recursive($this->input(), $this->allFiles());
        if (! $keys) {
            return $input;
        }
        ...
    }
    
  4. 所以你看到这里发生了什么?实际上您仍然具有test[]隐藏值,但all()方法只是将其与具有相同名称的文件合并。我认为为了简单起见他们为什么要这样做,我不认为 共同拥有两个同名的输入,具有不同的输入类型。

    我想,现在最简单的解决方案是通过request实例访问它。试试这个(未经测试,理论上应该有效):

    \Log::info(app('request')->file('test'));
    \Log::info(app('request')->get('test'));
    

    laravel.log文件中找到输出。您应该能够与它们进行简单的数组合并。

答案 1 :(得分:2)

好的,我可能找到了解决方案。

由于我正在编辑,我知道文件/隐藏输入是否是新的(如编辑中我可以添加其他项目)或从数据库中获取。

<form method="post" name="test" enctype="multipart/form-data">
   {{csrf_field()}}
   <input class="form-control" type="file" name="test[]" id="companion"/>
   <input type="hidden" name="test[id-{{id}}]" value="random-value" />
   <input type="submit" value="Submit">
</form>

通过这个“修复”,我将设法实现我的目标。

dd(request('test'));
------------------------
array:2 [▼
  "id-1" => "random-value"
  0 => UploadedFile {#539 ▶}
]

我不关心钥匙,所以我对这个解决方案感到满意。

注意,这只是我的问题的简化,但它帮助我理解它。

我希望它能帮助其他人=)

如果您有任何疑问,请随时问我;)

干杯。