首页 > 解决方案 > Laravel 验证规则需要两个字段中的任何一个,但两者都不应该存在

问题描述

当需要两个字段中的任何一个但不应同时存在时,是否有 Laravel 验证规则。

例如。手机号码和电子邮件,其中任何一个都应该存在,但不能同时存在。

标签: phplaravel

解决方案


不幸的是,我找不到一个。

为了满足您的需求,以下是我采取的步骤。

  1. Laravel 有一个验证规则,如果其他请求参数不存在,则需要一个请求参数。

required_without:foo,bar,...

仅当任何其他指定字段不存在时,验证中的字段才必须存在且不为空。

  1. 对于实现的情况,而不是两种情况,我必须想出一个自定义验证规则。

脚步

2a。打开终端并运行命令以生成自定义验证规则。 php artisan make:rule OneOf

OneOf是我的验证规则名称。给它起任何你想要的名字。(使用 PascalCase)。

2b。打开生成的文件添加您的逻辑。

<?php

namespace App\Rules;

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

class OneOf implements Rule
{
    public $oneOf = [];
    public $request = null;
    public $message = "";

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct(Request $request, array $oneOf, string $message = "")
    {
    $this->oneOf = $oneOf;
    $this->request = $request;
    $this->message = $message;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param string $attribute
     * @param mixed $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
    $count = 0;
    foreach ($this->oneOf as $param) {
        if($this->request->has($param)){
        $count++;
        }
    }
    return count($this->oneOf) && ($count === 1) ? true : false;

    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
    $json_encodedList = json_encode($this->oneOf);

    return  strlen(trim($this->message)) ? $this->message : "Please insert one of $json_encodedList.";
    }


}

2c。在您的控制器中,使用创建的自定义规则。

<?php

namespace App\Http\Controllers\Employee;

use App\Http\Controllers\Controller;
use App\Rules\OneOf;
use Illuminate\Http\Request;


/**
 * Class Employee
 * @package App\Http\Controllers\Employee
 */
class Employee extends Controller
{

    public function store(Request $request)
    {

    $request->validate([
        "email" => ["required_without:phone_number", new OneOf($request, ["email", "phone_number"])],

        "phone_number" => ["required_without:email", new OneOf($request, ["email", "phone_number"])],

    ]);
    
    // ...Custom project specific logic here

    return response()->json([]);
    }
}

如果您愿意,可以提供自定义消息。

您还可以将其应用于两个以上的请求参数


推荐阅读