laravel - 如何从请求中的数组中添加/删除元素
问题描述
我的请求看起来像这样
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。
但是我将我的地址验证器抽象在单独的文件中,并且在许多地方都使用了它。有些地方没有显示ship_to_the_same_address 复选框。
因此我不能使用'required_unless:ship_to_same_address,yes',
而且我不能使用
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 是的,我知道不建议使用模拟请求。
解决方案
如果您尝试从请求本身添加或删除输入:
您可以通过合并数据并让 Laravel 处理正在使用的数据源来轻松地将数据添加到请求中:
$request->merge(['input' => 'value']);
这将合并命名input
为请求的输入源的输入。
要删除输入,您可以尝试替换所有输入,而在替换中没有特定输入:
$request->replace($request->except('address.shipping'));
只有一个想法可以尝试。
推荐阅读
- angular - 将 Typescript 中的日期字段映射到后端 C# 中的日期时间字段
- c - 如何将输入从文件和命令行参数重定向到我的 C 程序到图形节点?
- python - 在 Gurobi 中使用 addVars 和 addConstrs
- php - Laravel AbstractVariables.php 第 54 行预期名称为字符串
- mysql - 提交表单时 WordPress 返回数据库错误
- sql - 如何制作使用已删除行中的值的 postgres SQL 函数?
- android - 允许访问后立即获取当前位置工作
- c# - 如何在 Winform 中搜索和显示 Integer?
- java - 有没有办法使用 MapStruct 将空字符串映射到 null?
- node.js - 是否可以在 twilio 中从多个呼叫中添加一个人?