【问题标题】:Laravel validation rule for either of two fields required but both should not be presentLaravel 验证规则需要两个字段中的任何一个,但两者都不应该存在
【发布时间】:2021-05-22 14:07:49
【问题描述】:

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

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    很遗憾,我找不到。

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

    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([]);
        }
    }
    
    

    您可以根据需要提供自定义消息。

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

    【讨论】:

      【解决方案2】:

      我已经稍微更新了这段代码,以确保如果它们为空,则不计算在内。请求可以有一个参数,但该参数为空,即使提供的两个字段之一没有任何内容,该规则仍将作为无效触发。

      <?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.";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2018-11-29
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多