Laravel请求int和字符串键奇怪的行为

时间:2016-07-27 15:04:35

标签: php laravel laravel-5

想象一下 - Laravel应用程序,可以获得请求。

情况是,自定义请求具有整数名称的输入。在自定义请求文件中,我添加了另一个字段,让我们说"字段"。所以首先$request->all()返回

array(
     1 => "value1",
     5 => "value5",
     12 => "value12",
)

并在添加新字段$request->all()后返回

array(
     1 => "value1",
     5 => "value5",
     12 => "value12",
     "fields" => array(
                      "key" => "value",
                 ),
)

现在出现问题 - $request->get("fields")返回null。

$request->all()返回字段。

$request->only(["fields"])返回带字段的数组。

$request->exists("fields")返回true。

为什么会这样?

修改

在自定义请求类中添加新字段:

public function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();

    $validator->after(function() use ($validator, $event)
    {
         $this->merge(["fields" => ["key" => "value"]]);
    }
    return $validator;
}

2 个答案:

答案 0 :(得分:1)

$request->all()应该返回通过请求提交的所有数据。表现得如此。

$request->only(["fields"])正在从请求中获取fields密钥并将其转换为数组[]。正常行为

$request->exists("fields")只是检查请求数据中是否存在该密钥。正常行为

展望Illuminate\Http\Request,我没有看到get()方法。我只看到用于从请求中提取输入的方法是$request->input('fieldName')。但是__get()中的Illuminate\Http\Request方法似乎有效。我会坚持使用input()方法,因为它更明确。

答案 1 :(得分:0)

认为您可能会遇到一个简单的范围问题,并且您的验证程序$this关闭中无法使用after

$validator->after(function() use ($validator, $event, $this)
{
     $this->merge(["fields" => ["key" => "value"]]);
}

如果您使用的是PHP 5.3或以下,则无法使用上述内容中的$this

$self = $this;
$validator->after(function() use ($validator, $event, $self)
{
     $self->merge(["fields" => ["key" => "value"]]);
}