php - Laravel 验证规则需要两个字段中的任何一个,但两者都不应该存在
问题描述
当需要两个字段中的任何一个但不应同时存在时,是否有 Laravel 验证规则。
例如。手机号码和电子邮件,其中任何一个都应该存在,但不能同时存在。
解决方案
不幸的是,我找不到一个。
为了满足您的需求,以下是我采取的步骤。
- Laravel 有一个验证规则,如果其他请求参数不存在,则需要一个请求参数。
仅当任何其他指定字段不存在时,验证中的字段才必须存在且不为空。
- 对于实现的情况,而不是两种情况,我必须想出一个自定义验证规则。
脚步
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([]);
}
}
如果您愿意,可以提供自定义消息。
您还可以将其应用于两个以上的请求参数。
推荐阅读
- git - 在 Fedora 33 中,使用 ssh id_rsa 文件的 git 操作在 GitLab.com 上失败
- sql - 如何检查日期时间列之间的日期时间
- c++ - OpenGL - 用箭头键移动对象
- javascript - 如何让页面加载时调用的函数与按钮一起使用
- python - 根据折叠量计算标签分布
- amazon-web-services - 使用 boto3 在 EFS 中创建目录
- raspberry-pi - Raspberry Pi 4 上的 SDL2:SDL 初始化失败 没有可用的视频设备
- python - 将散点图合并为一个图形
- nested - Typo3 > 9.4 - Typoscript 中的嵌套条件可用?
- python - 在主 GUI 界面和顶级 GUI 界面之间进行通信