【问题标题】:Laravel request() input file and input hidden with same nameLaravel request() 输入文件和输入隐藏同名
【发布时间】:2018-08-07 06:49:22
【问题描述】:

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

这是我的例子

<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 类型)和 随机值 的数组,相反,我只得到文件。

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

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

提前致谢。

【问题讨论】:

  • 我猜这是因为输入类型不同。如果它们是相同的输入类型,它会正常工作,但文件输入类型的工作方式不同。
  • @aynber 你知道我怎样才能将两者放在一个数组中吗?
  • 不,我没有。如果您只有一个文件和一种形式的隐藏变量,那么您不需要数组。
  • 不,不幸的是,我有一个复杂的表单,我正在执行 edit 操作,其中一些值可以是文件或静态内容。
  • 您需要改变您的方法,在编辑视图中您需要加载上传的文件并显示它们并带有删除选项,然后如果文件被删除,您可以允许上传新文件或其他内容。我只是在向你抛出想法:)

标签: php laravel file input request


【解决方案1】:

因为:

  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;
        }
        ...
    }
    

所以你明白这里发生了什么吗?您实际上仍然有 test[] 隐藏值,但 all() 方法只是将它与同名文件合并。我认为这是为了简单起见他们为什么会这样做,而且我认为拥有两个具有相同名称和不同输入类型的输入并不常见。

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

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

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

【讨论】:

    【解决方案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 ▶}
    ]
    

    我不关心密钥,所以我对这个解决方案很满意。

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

    希望对其他人有所帮助=)

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

    干杯。

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 2011-12-06
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多