我简化了这个问题的表格。
这是我的例子
<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 ▶}
]
知道为什么我得到这个结果? 我知道我可以更改变量的名称,但我想知道为什么它不能像那样工作。
提前致谢。
答案 0 :(得分:2)
因为:
您致电request('test')
。这在Illuminate\Foundation\helpers.php
function request($key = null, $default = null)
{
...
$value = app('request')->__get($key);
...
}
这会将调用定向到__get
方法,以便快速获取Illuminate\Http\Request.php
public function __get($key)
{
if (array_key_exists($key, $this->all())) {
return data_get($this->all(), $key);
}
...
}
问题出在特质Illuminate\Http\Concerns\InteractsWithInput
all()
方法
public function all($keys = null)
{
$input = array_replace_recursive($this->input(), $this->allFiles());
if (! $keys) {
return $input;
}
...
}
所以你看到这里发生了什么?实际上您仍然具有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 ▶}
]
我不关心钥匙,所以我对这个解决方案感到满意。
注意,这只是我的问题的简化,但它帮助我理解它。
我希望它能帮助其他人=)
如果您有任何疑问,请随时问我;)
干杯。