我的请求是这样的
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']);
因为泰勒说 ...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和是的,我知道不推荐嘲弄请求。
发布于 2018-07-31 07:32:11
如果您试图从请求本身添加或删除输入:
通过将数据合并到请求中并让Laravel处理正在使用的数据源,您可以很容易地将数据添加到请求中:
$request->merge(['input' => 'value']);
它将在名为input
的输入中合并到请求的输入源。
为了删除输入,您可以尝试替换替换中没有该特定输入的所有输入:
$request->replace($request->except('address.shipping'));
只是一个尝试的想法。
发布于 2018-07-31 06:55:00
发布于 2018-07-31 07:08:18
Laravel有一个名为array_forget
的助手方法,它所做的和听起来完全一样:
$requestArray = $request->all();
$newArray = array_forget($requestArray, 'address.shipping')
在对主问题进行编辑之后,为什么要删除请求的某些输入,我的主要答案就不再正确了。用户Lagbox有正确的答案用于所问的问题。
但是,我想指出的是,另一种解决方案是将请求类与验证分开。一个用于下订单(假设它是一个有人可以订购东西的系统),另一个用于更新您的帐户,如ship_to_same_address
和UpdateAccountRequest
类。
https://stackoverflow.com/questions/51606998
复制相似问题