我的请求看起来像这样
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 是的,我知道不建议使用模拟请求。
答案 0 :(得分:2)
Laravel有一个名为array_forget
的辅助方法,它的作用完全像这样:
$requestArray = $request->all();
$newArray = array_forget($requestArray, 'address.shipping')
在对主要问题(为什么要删除请求的某些输入)进行编辑之后,我的主要答案不再正确。用户Lagbox has the correct answer提出的问题。
但是,我想指出另一种解决方案是使用带有验证的单独的Request类。一个用于下订单(假设是一个可以在其中订购商品的系统),其中存在ship_to_same_address
,另一个用于诸如更新您的帐户之类的事情,例如PlaceOrderRequest
和UpdateAccountRequest
类。 / p>
答案 1 :(得分:2)
如果您要在请求本身中添加或删除输入:
通过合并数据并让Laravel处理正在使用的数据源,您可以轻松地将数据添加到请求中:
$request->merge(['input' => 'value']);
这将在名为input
的输入中合并到请求的输入源中。
要删除输入,您可以尝试替换所有输入而不在替换中使用该特定输入:
$request->replace($request->except('address.shipping'));
尝试一个想法。
答案 2 :(得分:1)