如何从请求中的数组添加/删除元素

时间:2018-07-31 06:46:50

标签: laravel laravel-5 request

我的请求看起来像这样

Array
(
  [name] => Eugene A
  [address] => Array
    (
        [billing] => Array
            (
                [address] => aaa
            )
        [shipping] => Array
            (
                [address] => bbb
            )
    )
)

我需要删除送货地址。但是如何?

我只能删除两个地址

$request->request->remove('address');

但我不想要它。

我只想删除送货地址,

$request->request->remove('address.shipping');

但这对我不起作用

Laravel 5.6

更新

我为什么需要它?

容易。我已经将我的表单请求验证提取为Illuminate\Foundation\Http\FormRequest的子类。 实际上,我只有很少的类可以进行验证。我在像这样的控制器中一一称呼它们:

app()->make(CustomerPostRequest::class); // validate Customer information
app()->make(AddressSaveRequest::class); // validate Addresses

为什么?

现在,我可以在单元测试中模拟该请求,并且可以抽象出我的验证。而且我可以在许多地方使用地址验证。

但是现在我需要更多的灵活性。为什么?

因为AddressSaveRequest规则看起来像这样

public function rules(): array
  {
    return [
        'address.*.address'    => [
            'bail',
            'required',
            'string',
        ],
   ...

它验证所有地址。 但是,如果选中了chech_box-ship_to_the_same_address,有时我不想验证送货地址。

但是我在单独的文件中抽象了我的地址验证器,它在很多地方都使用过。在某些地方未显示ship_to_the_same_address复选框。

因此,我无法使用'required_unless:ship_to_same_address,yes',

我不能使用

app()->makeWith(AddressSaveRequest::class, ['ship_to_the_same_address ' => 'yes']);

因为泰勒(Taylor)said ...when calling makeWith. In my opinion it should make a new instance each time this method is called because the given parameter array is dynamic.。而且确实如此,它不能与app()->instance(AddressSaveRequest::class, $addressSaveRequest);一起正常工作,并且不能在单元测试中进行模拟。

泰勒为什么要决定-我真的不知道。

PS 是的,我知道不建议使用模拟请求。

3 个答案:

答案 0 :(得分:2)

Laravel有一个名为array_forget的辅助方法,它的作用完全像这样:

$requestArray = $request->all();

$newArray = array_forget($requestArray, 'address.shipping')

Documentation

在对主要问题(为什么要删除请求的某些输入)进行编辑之后,我的主要答案不再正确。用户Lagbox has the correct answer提出的问题。

但是,我想指出另一种解决方案是使用带有验证的单独的Request类。一个用于下订单(假设是一个可以在其中订购商品的系统),其中存在ship_to_same_address,另一个用于诸如更新您的帐户之类的事情,例如PlaceOrderRequestUpdateAccountRequest类。 / p>

答案 1 :(得分:2)

如果您要在请求本身中添加或删除输入:

通过合并数据并让Laravel处理正在使用的数据源,您可以轻松地将数据添加到请求中:

$request->merge(['input' => 'value']);

这将在名为input的输入中合并到请求的输入源中。

要删除输入,您可以尝试替换所有输入而不在替换中使用该特定输入:

$request->replace($request->except('address.shipping'));

尝试一个想法。

答案 2 :(得分:1)

尝试一下:

$request->except(['address.shipping']);

详细信息:Laravel Request