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

oxalkeyp  于 2022-12-17  发布在  PHP
关注(0)|答案(3)|浏览(145)

是否有Laravel验证规则,用于两个字段中的任何一个是必需的,但两个字段不应同时存在。
例如,移动的号码和电子邮件,其中一个应该出现,但不能同时出现。

ubof19bj

ubof19bj1#

很不幸,我找不到。
为了满足您的需求,我采取了以下步骤。

  1. Laravel有一个验证规则,用于在其他请求参数不存在的情况下使一个 request param 成为必需。
    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([]);
    }
}

如果需要,可以提供自定义消息。
您还可以将其应用于两个以上的 * 请求参数 *。

noj0wjuj

noj0wjuj2#

我对这段代码做了一些更新,以确保如果内容为空,则不计算在内。请求可以有一个参数,但该参数为空,即使提供的两个字段中有一个没有内容,规则仍将作为无效规则触发。

<?php

namespace App\Rules;

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

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) && $this->request->$param != null){
                $count++;
            }
        }
        return count($this->oneOf) && ($count === 1) ? true : false;

    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        $i = 1;
        $length = count($this->oneOf);
        $fieldNames = null;
        foreach($this->oneOf as $fieldName) {
            if($i < $length) {
                $fieldNames .= Str::replace('_', ' ', Str::title($fieldName)) . ', ';
            } else {
                $fieldNames .= Str::replace('_', ' ', Str::title($fieldName));
            }
            $i++;
        }
        return  strlen(trim($this->message)) ? $this->message : "Only one of these fields should be used: $fieldNames.";
    }
}
nmpmafwu

nmpmafwu3#

您也可以通过组合required_without和prohibited_unless来实现这一点。
例如:

[
        'email' => 'required_without:name|prohibited_unless:name,""'
        'name' => 'required_without:email|prohibited_unless:email,""'
    ]

注:禁止_除非是相当新的,自Laravel 8起提供

相关问题