首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从请求的数组中添加/删除元素

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

Stack Overflow用户
提问于 2018-07-31 06:46:49
回答 3查看 4.8K关注 0票数 3

我的请求是这样的

代码语言:javascript
代码运行次数:0
运行
复制
Array
(
  [name] => Eugene A
  [address] => Array
    (
        [billing] => Array
            (
                [address] => aaa
            )
        [shipping] => Array
            (
                [address] => bbb
            )
    )
)

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

我只能删除这两个地址,

代码语言:javascript
代码运行次数:0
运行
复制
$request->request->remove('address');

但我不想要。

我只想删除投递地址,如下所示

代码语言:javascript
代码运行次数:0
运行
复制
$request->request->remove('address.shipping');

但这对我不起作用

Laravel 5.6

更新

为什么我需要它?

很简单。我已经将表单请求验证抽象为一个类,该类是Illuminate\Foundation\Http\FormRequest的子类。实际上,我几乎没有几个要验证的类。我在控制器里一个接一个地叫他们:

代码语言:javascript
代码运行次数:0
运行
复制
app()->make(CustomerPostRequest::class); // validate Customer information
app()->make(AddressSaveRequest::class); // validate Addresses

为什么?

现在我可以在单元测试中模拟这个请求,并且我可以将我的验证抽象出来。我可以在很多地方使用地址验证。

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

因为AddressSaveRequest规则看起来像这样

代码语言:javascript
代码运行次数:0
运行
复制
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',

我不能用

代码语言:javascript
代码运行次数:0
运行
复制
app()->makeWith(AddressSaveRequest::class, ['ship_to_the_same_address ' => 'yes']);

因为泰勒 ...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和是的,我知道不推荐嘲弄请求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-31 07:32:11

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

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

代码语言:javascript
代码运行次数:0
运行
复制
$request->merge(['input' => 'value']);

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

为了删除输入,您可以尝试替换替换中没有该特定输入的所有输入:

代码语言:javascript
代码运行次数:0
运行
复制
$request->replace($request->except('address.shipping'));

只是一个尝试的想法。

票数 5
EN

Stack Overflow用户

发布于 2018-07-31 06:55:00

试试这个:

代码语言:javascript
代码运行次数:0
运行
复制
$request->except(['address.shipping']);

详细信息:Laravel请求

票数 2
EN

Stack Overflow用户

发布于 2018-07-31 07:08:18

Laravel有一个名为array_forget的助手方法,它所做的和听起来完全一样:

代码语言:javascript
代码运行次数:0
运行
复制
$requestArray = $request->all();

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

文档

在对主问题进行编辑之后,为什么要删除请求的某些输入,我的主要答案就不再正确了。用户Lagbox有正确的答案用于所问的问题。

但是,我想指出的是,另一种解决方案是将请求类与验证分开。一个用于下订单(假设它是一个有人可以订购东西的系统),另一个用于更新您的帐户,如ship_to_same_addressUpdateAccountRequest类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51606998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档