Laravel 动态验证
Laravel dynamic validation
我正在使用 Laravel 并且我有自定义验证。我想将一些值传递给验证 class 并根据数据库对其进行验证,因此我将所有验证逻辑保留在验证 class 中。这是我的代码,但未触发验证错误:
public function rules() {
$userCode = UserCode::getCode();
$rules = [
'name' => 'required|string',
'email' => 'required|email',
$userCode => 'unique:user_codes,code,'. $userCode
];
return $rules;
}
我在这里做错了什么?即使值 $userCode
已经存在于数据库中,也永远不会触发验证。例如,如果请求包含错误的电子邮件,则会触发验证。
编辑:我有这个 user_codes table,它有一个必须保持唯一的代码列。 UserCode::getCode()
生成此代码。所以我也想在将它传递给控制器之前检查此代码在 table user_codes 中是否唯一。我已经有了自定义验证器,但问题是我希望它也验证此代码。验证器可以与其他请求主体一起正常工作。问题是这段代码不是从请求体传递的,而只是从另一个方法生成的。
你的问题不清楚,我知道你有一个名为 code
的专栏
想要独一无二,可以在请求中添加usercode,
request()->merge(['userCode'=>$userCode]);
然后
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => 'unique:user_codes,code,'.UserCode::getId().',id'
];
我根据你的问题回答了我的理解
好的,从以下内容开始:
php artisan make:rule SomeAwesomeRule
Then edit that created Rule
class SomeAwesomeRule implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//some logic that needs to be handled...
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('Some.nice.translated.message');
}
}
然后应用规则
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => new SomeAwesomeRule(#this is a constructor so pass away)
];
见
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => 'unique:user_codes,code'
];
//或
$userCode="";
do{
$userCode = UserCode::getCode();
}
while(UserCode::where('code',$userCode)->first());
// after loop you sure the code is unique
$rules = [
'name' => 'required|string',
'email' => 'required|email',
];
您可以使用 FormRequest
class 和 prepareForValidation() 方法来完成此操作。它应该看起来像这样:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class WhateverRequest extends FormRequest
{
protected function prepareForValidation(): void
{
$this->merge([
'user_code' => UserCode::getCode(),
]);
}
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|email',
'user_code' => 'unique:user_codes,code'
];
}
}
我正在使用 Laravel 并且我有自定义验证。我想将一些值传递给验证 class 并根据数据库对其进行验证,因此我将所有验证逻辑保留在验证 class 中。这是我的代码,但未触发验证错误:
public function rules() {
$userCode = UserCode::getCode();
$rules = [
'name' => 'required|string',
'email' => 'required|email',
$userCode => 'unique:user_codes,code,'. $userCode
];
return $rules;
}
我在这里做错了什么?即使值 $userCode
已经存在于数据库中,也永远不会触发验证。例如,如果请求包含错误的电子邮件,则会触发验证。
编辑:我有这个 user_codes table,它有一个必须保持唯一的代码列。 UserCode::getCode()
生成此代码。所以我也想在将它传递给控制器之前检查此代码在 table user_codes 中是否唯一。我已经有了自定义验证器,但问题是我希望它也验证此代码。验证器可以与其他请求主体一起正常工作。问题是这段代码不是从请求体传递的,而只是从另一个方法生成的。
你的问题不清楚,我知道你有一个名为 code
想要独一无二,可以在请求中添加usercode,
request()->merge(['userCode'=>$userCode]);
然后
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => 'unique:user_codes,code,'.UserCode::getId().',id'
];
我根据你的问题回答了我的理解
好的,从以下内容开始:
php artisan make:rule SomeAwesomeRule
Then edit that created Rule
class SomeAwesomeRule implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//some logic that needs to be handled...
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('Some.nice.translated.message');
}
}
然后应用规则
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => new SomeAwesomeRule(#this is a constructor so pass away)
];
见
$rules = [
'name' => 'required|string',
'email' => 'required|email',
'userCode' => 'unique:user_codes,code'
];
//或
$userCode="";
do{
$userCode = UserCode::getCode();
}
while(UserCode::where('code',$userCode)->first());
// after loop you sure the code is unique
$rules = [
'name' => 'required|string',
'email' => 'required|email',
];
您可以使用 FormRequest
class 和 prepareForValidation() 方法来完成此操作。它应该看起来像这样:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class WhateverRequest extends FormRequest
{
protected function prepareForValidation(): void
{
$this->merge([
'user_code' => UserCode::getCode(),
]);
}
public function rules(): array
{
return [
'name' => 'required|string',
'email' => 'required|email',
'user_code' => 'unique:user_codes,code'
];
}
}