代码之家  ›  专栏  ›  技术社区  ›  Yevgeniy Afanasyev

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

  •  1
  • Yevgeniy Afanasyev  · 技术社区  · 7 年前

    我的请求是这样的

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

    我需要删除送货地址。但是怎么做呢?

    我只能删除两个地址,

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

    但我不想要。

    我只想删除送货地址,就像这样

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

    但这对我不起作用

    拉维尔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被勾选。

    但是我的地址验证器被抽象到单独的文件中,并且在很多地方都被使用。有些地方没有显示“送货到”相同地址的复选框。

    所以我不能用 'required_unless:ship_to_same_address,yes',

    我不能用

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

    因为泰勒 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); 不能在单元测试中模拟。

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

    聚苯乙烯 是的,我知道不推荐模仿请求。

    3 回复  |  直到 7 年前
        1
  •  3
  •   lagbox    7 年前

    如果您试图从请求本身添加或删除输入:

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

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

    将合并到名为 input 进入请求的输入源。

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

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

    只有一个想法可以尝试。

        2
  •  2
  •   Douwe de Haan    7 年前

    Laravel有一个名为 array_forget ,它的作用和听起来完全一样:

    $requestArray = $request->all();
    
    $newArray = array_forget($requestArray, 'address.shipping')
    

    Documentation

    在编辑了主要问题以及为什么要删除请求的某些输入之后,我的主要答案不再正确。用户 Lagbox has the correct answer 对于被问到的问题。

    不过,我想指出的是,另一个解决方案将有独立的请求类与验证。一种用于下订单(假设这是一个有人可以订购东西的系统),其中 ship_to_same_address 是当前的,另一个用于更新您的帐户,如 PlaceOrderRequest UpdateAccountRequest 上课。

        3
  •  1
  •   Manohar Khadka    7 年前

    试试这个:

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

    细节: Laravel Request

    推荐文章