php 如何绕过Laravel中的FormRequest验证来存储user_id?

iyfjxgzm  于 2022-11-21  发布在  PHP
关注(0)|答案(1)|浏览(172)

我正在构建一个API,我需要存储一个客户。当存储客户时,会自动创建一个用户。创建的用户属于客户,客户需要在其数据库中存储先前创建的user_id
在下面的代码中,我使用FormRequest来存储一个新的Customer。我使用DB Transaction来确保操作的安全性。在我存储User之后,我使用他的id来关联Customer请求中的字段user_id

public function store(StoreCustomerRequest $request)
{
    /* --- DB Transaction -> Create User + Customer --- */
    DB::transaction(function () use ($request) {
        // -> Creates User
        $create_user = (new UserController)->store($request);

        // -> Creates Customer
        $request->merge(['user_id' => $create_user->id]);
        $customer = Customer::create($request->validated());

        return new CustomerResource($customer);
    });
}

StoreCustomerRequest具有以下规则。

public function rules()
{
    return [
        'user_id' => 'required|integer|exists:users,id',
        'phone' => 'required|min:0|max:20',
        'points' => 'required|min:0',
        'nif' => 'nullable|digits:9',
        'default_payment_type' => 'nullable|in:VISA,PAYPAL,MBWAY',
        'default_payment_reference' => 'nullable',
        'custom' => 'nullable'
    ];
}

当我试图存储一个新的客户时,字段user_id变为空(因为没有要关联的用户)。因此,出现了一个错误,说“用户id字段是必需的"。
问题是:如何绕过此验证并使用先前创建的user_id存储客户?
我已经尝试更改StoreCustomerRequest中的规则,使user_id可为空,但当我尝试存储它时,它说用户不能为空。

1zmg4dgp

1zmg4dgp1#

在laravel中有一个规则叫做sometimes,它只验证字段是否存在。你可以在规则中使用它,比如。

public function rules()
{
    return [
        'user_id' => 'sometimes|integer|exists:users,id'
    ];
}

相关问题