<?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([]);
}
}
3条答案
按热度按时间ubof19bj1#
很不幸,我找不到。
为了满足您的需求,我采取了以下步骤。
required_without:foo,bar,...
只有当任何其他指定的字段不存在时,验证的字段才必须存在且不为空。
1.对于实现,而不是两者都的情况,我必须提出一个自定义的验证规则。
步骤
2a.打开终端并运行命令以生成自定义验证规则。
php artisan make:rule OneOf
这里
OneOf
是我的验证规则名。你可以随意命名它。(使用PascalCase)2b.打开生成的文件,添加逻辑。
2c.在控制器中,使用创建的自定义规则。
如果需要,可以提供自定义消息。
您还可以将其应用于两个以上的 * 请求参数 *。
noj0wjuj2#
我对这段代码做了一些更新,以确保如果内容为空,则不计算在内。请求可以有一个参数,但该参数为空,即使提供的两个字段中有一个没有内容,规则仍将作为无效规则触发。
nmpmafwu3#
您也可以通过组合required_without和prohibited_unless来实现这一点。
例如:
注:禁止_除非是相当新的,自Laravel 8起提供