Laravel: 使用闭包时使验证规则失败
Laravel: make validation rule fail when using closure
假设我有一个自定义逻辑来验证 FormRequest
字段的唯一性,需要在数据库中找到另一个资源,如下所示:
class CreateMyResourceRequest extends FormRequest {
public function rules() {
return [
'my_field' => [
Rule::unique('some_other_resource', 'some_column')
->where(function ($query) {
$otherResource = SomeOtherResource::where(...)->firstOrFail();
// Process the retrieved resource
}),
]
firstOrFail()
调用显然使请求失败并返回 404 - 未找到,而我想 return 返回 422 并在字段上出现验证错误。
有没有办法在仍然使用框架提供的 Rule::unique()
的同时实现这一点?
提前致谢!
不要使用 firstOrFail
,而只需使用 first
并检查输出是否为空。如果是,return false.
或者,更Laravel的方法是:
$query->leftJoin('otherresource', 'primarykey', 'foreignkey')->where(...)
我建议如下
public function rules()
{
return [
"your_field" => ["you_can_have_more_validations_here", function($key, $value, $cb) {
$queryResult = SomeModel::find(1);
if (someCondition) {
$cb("your fail message");
}
}]
];
}
当 $cb
运行 验证将失败并返回 422
假设我有一个自定义逻辑来验证 FormRequest
字段的唯一性,需要在数据库中找到另一个资源,如下所示:
class CreateMyResourceRequest extends FormRequest {
public function rules() {
return [
'my_field' => [
Rule::unique('some_other_resource', 'some_column')
->where(function ($query) {
$otherResource = SomeOtherResource::where(...)->firstOrFail();
// Process the retrieved resource
}),
]
firstOrFail()
调用显然使请求失败并返回 404 - 未找到,而我想 return 返回 422 并在字段上出现验证错误。
有没有办法在仍然使用框架提供的 Rule::unique()
的同时实现这一点?
提前致谢!
不要使用 firstOrFail
,而只需使用 first
并检查输出是否为空。如果是,return false.
或者,更Laravel的方法是:
$query->leftJoin('otherresource', 'primarykey', 'foreignkey')->where(...)
我建议如下
public function rules()
{
return [
"your_field" => ["you_can_have_more_validations_here", function($key, $value, $cb) {
$queryResult = SomeModel::find(1);
if (someCondition) {
$cb("your fail message");
}
}]
];
}
当 $cb
运行 验证将失败并返回 422