Laravel 5.8 验证竞争条件

Muh*_*tan 10 validation request race-condition laravel laravel-5.8

POST在控制器内的请求方法上有这个验证规则:

class CreateOrderController extends Controller
{
    public function create(Request $request)
    {
        $this->validate($request, [
            'store_id' => $request->order_type === OrdersTypeConstants::P2P  ? "" : "required|" . 'exists:stores,id',
            'p2p_type' => [Rule::in([OrdersTypeConstants::P2PCOURIER, OrdersTypeConstants::P2PPURCHASE])],
            'items' => 'required_if:p2p_type,'.OrdersTypeConstants::P2PPURCHASE.'|array',
            'items.*.id' => 'nullable|numeric',
            'items.*.quantity' => 'nullable|integer|min:1',
            'items.*.adjustment' => 'nullable|numeric',
            'items.*.image' => 'nullable|string',
            'items.*.addons' => 'array',
            'items.*.reward_applied' => 'boolean',
            'items.*.replacement_strategy.type' => [
                'string',
                Rule::in([ItemReplacementStrategyConstants::REMOVE,ItemReplacementStrategyConstants::BEST_MATCH, ItemReplacementStrategyConstants::SPECIFIC])
            ],
            'items.*.replacement_strategy.quantity' => 'integer|min:1',
            'items.*.replacement_strategy.item_id' => 'numeric',
            'address_id' => 'exists:addresses,id,user_id,' . $client_id,
            'address_id_p1' => 'exists:addresses,id,user_id,' . $client_id,
            'use_cash_deposit' => 'boolean',
        ]);
Run Code Online (Sandbox Code Playgroud)

有时它会返回,The store id field is required即使它实际上正在发送,正如您在错误日志中看到的那样: 在此处输入图片说明

它仅在生产环境中随机发生 - 并非始终如一地发生,仅在 firebase 上报告。

为什么会发生这种情况?

Vic*_*tii 1

我身上发生过好几次。问题始终是无效的 JSON。您可以在这里验证您的。

当 Laravel 遇到无效的 JSON 时,它会忽略它,并假设有效负载为空。

事实上,它给你一个验证错误store_id is required并不是巧合。您的框架设置为在第一个失败的规则处停止,而该规则恰好是store_id => 'required'.