Laravel规则:根据两个请求输入的自定义验证

问题描述 投票:0回答:1

我想验证用户是否与请求验证中的订单相关联。

订单迁移:

$table->bigIncrements('id');

$table->unsignedBigInteger('user_id')->nullable();

...

$table->timestamps();

$table->softDeletes();

用户表:

$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamps();

我已经手动创建了一个检查订单是否与用户关联的功能

public function checkIfOrderIsAssociatedWithTheUser(Request $request){
     $checkExistsStatus = Order::where('id',$request->order_id)->where('user_id', $request->user_id)->exists();

    return $checkExistsStatus;
}

当我需要检查合作伙伴时,必须像下面这样调用此函数:

$this->validate($request, [
    'order_id' => 'required|exists:orders,id',
    'user_id' => 'required|exists:users,id'
]);

$checkExistsStatus = $this->checkIfOrderIsAssociatedWithTheUser($request);

if(!$checkExistsStatus){
    return redirect()->back()->withErrors([
        'Order and user is not linked'
    ]);
}else{
    ...
}

我试图创建一个新规则:CheckAssociationBetweenOrderAndUser,但是我无法将user_id传递给它。

$this->validate($request, [
    //unable to pass user_id
    'order_id' => ['required', new CheckAssociationBetweenOrderAndUser()]
]);

是否有更好的方法通过创建自定义新规则来验证关联检查?还是这是检查关联的唯一方法?

php laravel laravel-5 laravel-5.7 laravel-validation
1个回答
3
投票

创建自定义规则是一种很好的尝试。您可以在构造函数中将$request作为参数传递,例如

$this->validate($request, [
    'field' => ['required', new CustomRule ($request)]
]);
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\Request;

class CustomRule implements Rule
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.